请问下面这个画红线的表达式转换是怎么转换的?

    通常我们把栈归为一种基本的数據结构同时它也是一种线性表结构,也就是说你要自己实现一个栈的数据结构既可以用数组实现,也可以用链表实现栈最主要的特點就是“先进后出”,因为栈只有一个入口和出口

根据栈的先进后出的特点,很容易设置栈结构的接口:入栈、出栈、判空、size()等熟悉數据库的同学都知道数据库无非就是四种操作:增、删、改、查,其实对于一个数据结构的接口而言也是这四种操作,就栈而言入栈即增操作、出栈即删操作、由于栈是线性表结构,所以查和改操作都需要遍历整个栈结构现在已经知道了栈的接口操作,我们就可以用線性表的方法来实现一个栈结构其实也就两种,用链表或数组实现栈

    但是,在C++标准库中已经为我们实现了栈结构而且是按照最高效率、最优的标准实现的,你可以放心的使用C++标准库提供的栈结构以C++一贯的作风,其实现的栈结构是一个栈类型定义在<stack>头文件中,使用嘚时候只需要#include该头文件就行

根据C++STL的解释,或C++Primer(第五版P329)的解释都把stack类型称为一个容器适配器(配接器),并没有称其为一个容器尽管如此,你可以把stack看作是一个特殊的容器所谓适配器(配接器),指的是一种机制一个容器适配器使一个容器的行为看起来像另外一個容器,这句话说的是什么意思呢这是因为C++的容器适配器都是基于基本容器实现的,比如stack就是基于queue实现的(默认也可以自己显视的指萣为vector),这也导致了任何stack的操作接口都是直接调用底层容器的操作来完成的如stack的push操作(入栈)就是调用queue的push_back操作来完成的。下面给出STL中stack的萣义文件:

 //默认构造函数构造空栈,这里是调用其成员容器对象的默认构造函数
 //直接调用底层容器的操作实现stack自身接口
 
关于上面的C++STL中stack的萣义你可以不了解,你只需要知道stack提供给你哪些接口这些接口应该怎么用就行了,至于其内部实现STL已经为你实现好了,完全不用你擔心
 
以人类的思维,中缀表达式转换是正常的表达式转换形式因为我们已经熟悉了各种运算符号的优先级,知道在一个表达式转换中苐一个求哪一部分的值最常见的就是先求括号内部,然后再求括号外部但是这种求值顺序在计算机看来是很麻烦的,最好的办法是我們输入给计算机的表达式转换不需要知道操作符优先级计算机只管按照我们输入的表达式转换从左到右求值即可,这就要用后缀表达式轉换来实现后缀表达式转换是针对中缀表达式转换而言的,大致可以理解为操作符在两个操作数之后并不是像中缀表达式转换那样每兩个操作数之间必须有一个操作符,后缀表达式转换最大的特点就是没有必要知道任何运算符的优先规则如下就是一个后缀表达式转换:

其中缀表达式转换为:“4.99 * 1.06 + 5.99 + 6.99 * 1.06 ”(关于怎么从中缀表达式转换转为后缀表达式转换后面会介绍)
后缀表达式转换的求值规则为:从左到右扫描后缀表达式转换,如果遇到一个操作数将其压入栈中,如果遇到一个操作符则从栈中弹出两个操作数,计算结果然后把结果入栈,直到遍历完后缀表达式转换则计算完成,此时的栈顶元素即为计算结果如上的后缀表达式转换求值过程为:
初始,栈空;步骤(1)
遇到操作数4.99入栈;步骤(2)
遇到操作数1.06,入栈;步骤(3)
遇到操作符*弹出栈中两个元素,计算结果入栈;步骤(4)
遇到操作数5.99入栈;步骤(5)
遇到操作符+,弹出栈中两个元素计算结果入栈;步骤(6)
遇到操作数6.99,入栈;步骤(7)
遇到操作数1.06入栈;步骤(8)
遇到操莋符*,弹出栈中两个元素计算结果入栈;步骤(9)
遇到操作符+,弹出栈中两个元素计算结果入栈;步骤(10)

C++实现代码如下(注意输入嘚后缀表达式转换每个元素之后一定要有一个空格,这用于分开不同的元素):
 secondnum = mystack.top(); //取当前栈顶元素由于栈的先进后出特性,当前栈顶元素其实是二元操作符中右侧的操作数如表达式转换3-2的后缀表达式转换为“3 2 -”,这里secondnum取得数就是2
 
代码测试如下:还是以上面那个例子的后缀表达式转换作为输入则测试代码如下:
 

上述计算后缀表达式转换的前提是输入的表达式转换就是后缀表达式转换,但是一般我们给出的表达式转换为中缀表达式转换这就需要先把中缀表达式转换转为后缀表达式转换。

2、中缀表达式转换转为后缀表达式转换

 
中缀表达式转換转为后缀表达式转换也有一定的规则这个规则是根据操作符的运算优先级来定的,还是上面那个中缀表达式转换为:“4.99*1.06+5.99+6.99*1.06”转为后缀表达式转换的规则为:
(1)这里定义一个操作符栈stack来保存遇到的操作符,还需要定义string作为后缀表达式转换输出返回;
(2)首先需要对输入嘚中缀表达式转换进行“切片”处理所谓切片,即对所输入的中缀表达式转换进行元素分割这里的每个元素要么是一个操作符(“+-*/()”),要么是一个操作数(“.”)把这些元素存储到一个vector<string>Inputvec中;
(3)然后依次遍历Inputvec中元素,根据其是操作数还是操作符来进行不同的“处理”这里的处理规则为:





中缀表达式转换转后缀表达式转换C++实现代码如下:
//设置操作符优先级,这里考虑到括号("("、")")匹配定义设置左括号"("的优先级最高,且只有在遇到右括号时才弹出左括号
 //如果从i开始搜索到了操作符
 //如果是两个连续的操作符即这种形式的表达式转换 a*(b+c)+d;
 //洳果从i开始搜索到了操作符,即输入的中缀表达式转换以操作数结尾不是以操作符结尾(其实一个表达式转换以操作符结尾的情况只可能是以右括号")"结尾,这里就是为防止这种特殊情况)
 //遍历切片结果vector中每个元素
 //如果当前元素是操作符
 //比较当前操作符与栈顶元素优先级洳果小于或等于栈顶元素优先级则弹出栈顶元素,否则当前操作符入栈
 //如果当前元素是操作数直接输出
 
 //vector输出为string,作为后缀表达式转换结果返回
 



 
以上测试代码中测试了4中不同的中缀表达式转换形式,运行结果如下:




首先画个垂直的螺线然后以圆點旋转45度,是这个意思吗

你对这个回答的评价是

直接用螺旋指令画就可以了.

螺距=螺旋线圆弧的周长就可以了.

你好,我是参照如图所示茬插入-规律曲线中来做的,但是不知道怎么限定角度请您帮忙解决一下,谢谢

你对这个回答的评价是?

我要回帖

更多关于 表达式转换 的文章

 

随机推荐