续前篇-关于逆波兰表达式的计算

相对于逆波兰表达式的转换,逆波兰表达的计算可谓简单不少。

具体计算方法参考:http://www.cnblogs.com/vpoet/p/4659546.html

这里也大致梳理一下:

1.新建一个栈将逆波兰表达式的数字依次压入栈中

2.当遇到运算符时,出栈两个数同时将运算结果压栈

3.重复步骤2直到计算计算,栈中的元素即为逆波兰表达式的计算结果。

实现如下:

  1 #include <iostream>
  2 #include <stack>
  3 using namespace std;
  4
  5
  6 int operateprior(char a1)
  7 {
  8     int prior;
  9
 10     switch(a1)
 11     {
 12     case ‘(‘:
 13         prior=0;
 14         break;
 15     case ‘)‘:
 16         prior=0;
 17         break;
 18     case ‘+‘:
 19         prior=1;
 20         break;
 21     case ‘-‘:
 22         prior=1;
 23         break;
 24     case ‘*‘:
 25         prior=2;
 26         break;
 27     case ‘/‘:
 28         prior=2;
 29         break;
 30     case ‘%‘:
 31         prior=2;
 32         break;
 33     }
 34     return prior;
 35 }
 36
 37
 38 char* NiBoLanFun(char* Str)
 39 {
 40     stack<char> N;
 41     stack<char> OP;
 42
 43     while(*Str!=‘\0‘)
 44     {
 45         if(*Str>=‘0‘&&*Str<=‘9‘)
 46         {
 47             N.push(*Str);
 48             Str++;
 49         }
 50         else
 51         {
 52             if(*Str==‘(‘||OP.empty())
 53             {
 54                 OP.push(*Str++);
 55             }
 56             else
 57             {
 58                 if(*Str==‘)‘)
 59                 {
 60                     while(!OP.empty())
 61                     {
 62                         //cout<<"OP.top="<<OP.top()<<endl;
 63                         if(OP.top()!=‘(‘)
 64                         {
 65                             N.push(OP.top());
 66                         }
 67                         OP.pop();
 68                         if(OP.top()==‘(‘)
 69                         {
 70                             OP.pop();
 71                             break;
 72                         }
 73                     }
 74                     Str++;
 75                 }
 76                 else
 77                 {
 78                     while(!OP.empty()&&operateprior(*Str)<operateprior(OP.top()))
 79                     {
 80                         N.push(OP.top());
 81                         OP.pop();
 82                     }
 83                     OP.push(*Str++);
 84                 }
 85             }
 86         }
 87
 88
 89
 90     }
 91
 92     while(!OP.empty())
 93     {
 94         N.push(OP.top());
 95         OP.pop();
 96     }
 97
 98     //cout<<"The Trans string size="<<N.size()<<endl;
 99     char* TransStr;
100     TransStr=new char[N.size()+1];
101     memset(TransStr,‘\0‘,N.size()+1);
102     int i=N.size()-1;
103     while(!N.empty())
104     {
105         TransStr[i]=N.top();
106         N.pop();
107         i--;
108     }
109     return TransStr;
110 }
111
112 int CalcuLateFun(char* Str)
113 {
114     int i=0;
115     stack<int> S;
116
117     while(*Str!=‘\0‘)
118     {
119         if(*Str>=‘0‘&&*Str<=‘9‘)
120         {
121             S.push(*Str-‘0‘);
122             Str++;
123         }
124         else
125         {
126             int temp1,temp2;
127             temp1=S.top();
128             S.pop();
129             temp2=S.top();
130             S.pop();
131
132             if(*Str==‘+‘)
133             {
134                 S.push(temp1+temp2);
135                 Str++;
136             }
137             if(*Str==‘-‘)
138             {
139                 S.push(temp2-temp1);
140                 Str++;
141             }
142             if(*Str==‘*‘)
143             {
144                 S.push(temp1*temp2);
145                 Str++;
146             }
147             if(*Str==‘/‘)
148             {
149                 S.push(temp2/temp1);
150                 Str++;
151             }
152             if(*Str==‘%‘)
153             {
154                 S.push(temp2%temp1);
155                 Str++;
156             }
157         }
158     }
159
160
161
162     return S.top();
163 }
164
165 void main()
166 {
167     char str[50]={‘\0‘};
168     char *AfterStr;
169     cout<<"Please input the operate string: ";
170     cin>>str;
171     AfterStr=NiBoLanFun(str);
172     cout<<"The Trans String is: "<<AfterStr<<endl;
173     cout<<"The Calculate Answer is: "<<CalcuLateFun(AfterStr)<<endl;
174     return;
175 }

运行截图:

注意:

当从栈中弹出两个数据计算的时候应该是考虑两个数的运算顺序

当然对于加法乘法运算是没影响的,但是对于减法除法以及求余运算

应该是按照下面的运算顺序:

data2/data1 data2-data1 data2%data1

其中data2为后出栈的数据,data1为先出栈的数据

时间: 2024-10-27 03:51:42

续前篇-关于逆波兰表达式的计算的相关文章

栈的操作实现逆波兰表达式的计算

代码如下: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 #define MAXBUFFER 10 typedef double ElemType; typedef struct { ElemType *base; ElemType *top; int StackSize; }sqStack; v

Java解析字符串表达式--逆波兰表达式的计算

问题来由: 读入一个字符串形式的四则运算表达式,输出对应的计算结果.如读入的是"6 * ( 5 + ( 2 + 3) * 8 + 3)",那么解析后的输出结果应为288. 思路: 一般的计算过程是这样的,首先计算优先级最高的小括号里面的内容,即"( 5 + ( 2 + 3) * 8 + 3)", 将"2 + 3"的计算结果并存为A,接着用计算"A*8",并存为B 计算"5+B+3",结果存为C 最后计算&q

调度场算法与逆波兰表达式

本文的主要内容是如何求一个给定的表达式的值,具体思路就是先将普通算术的中缀表达式转化为后缀表达式,这一步用到的算法叫做调度场算法.然后对后缀表达式,也就是逆波兰表达式求值. 题目:http://acm.hdu.edu.cn/showproblem.php?pid=3596 代码:(参考别人的重构) #include <iostream> #include <string.h> #include <stdio.h> #include <math.h> #inc

逆波兰表达式(后缀表达式)

前/中/后缀表达式的转换 自然表达式转换为前/中/后缀表达式,其实是很简单的.首先将自然表达式按照优先级顺序,构造出与表达式相对应的二叉树,然后对二叉树进行前/中/后缀遍历,即得到前/中/后缀表达式. 举例说明将自然表达式转换成二叉树: a×(b+c)-d ① 根据表达式的优先级顺序,首先计算(b+c),形成二叉树 ②然后是a×(b+c),在写时注意左右的位置关系 ③最后在右边加上 -d 然后最这个构造好的二叉树进行遍历,三种遍历的顺序分别是这样的: ① 前序遍历:根-左-右 ② 中序遍历:左-

逆波兰表达式的实现(也叫后缀表达式)

本文主要偏重实现如何将字符串表达式转换为逆波兰表达式. 关于其讲解参考我转载的一篇博文:http://www.cnblogs.com/vpoet/p/4659546.html 先说说优先级: ()    +-     */%(从左到右递增) 下面先简单再梳理一下: 1.建立两个栈,一个为N(数据栈),一个为OP(运算符栈) 2.将字符串从左向右遍历,把数据压入数据栈,把运算符压入运算符的栈   关于运算符压栈的规则:⑴ 如果OP为空直接将运算符压入栈 ⑵ 如果不为空,则比较待入栈元素和栈顶元素的

栈,逆波兰表达式???

这两天一直在想老师提出的要求:四个数的运算,让一个函数去实现,一次性的把四个数字以及三个运算符传递过去(数是随机产生的,运算符是随机产生的),说到随机产生运算符下面是我写的随机产生运算符的例子,但是还是没有达到自己想要的要求,自己也上网查了一些资料,但是介绍的都不是很详细,看不太懂,而且大部分都是些怎么不让其产生重复的元素. 这样写的结果是有些情况永远也出不来而且这样写的结果就好像是每一个数组里面的元素就好像是商量好了一样,说第几个元素出来就第几个元素出来,请求老师指导一下. 还说四个数的运算吧

简单计算机——逆波兰表达式

逆波兰数:逆波兰数由两部分组成(操作数,操作符)--是波兰表达式的一种,即操作符在操作数的后面. 形式:A+B*C-D = ABC*D-; (A+B)*C-D = AB+C*D-; 既然我们知道了,后缀表达式那我们表达式是唯一的吗?我们来看一组数据: 例如:(A+B)*C-D 和 C*(A+B)-D; 很显然第二个的表达式为:C*AB+D-;虽然对最后的结果无影响,但我们需要知道逆波兰的多样性. 注意事项: 1.如果出现1+23 = 123+,该如何判断它的数值呢? 可以利用分割符来进行很好的辅

基于逆波兰表达式的公式解析器-算法和思路(一)

背景: 近期项目须要自己完毕Excel的公式解析和求值,在Java中能够使用POI解析Excel公式然后求值.可是项目须要JS端和Java后端均须要支持公式解析,所以就须要自己写一套了.事实上公式解析器整体上并不复杂.原理使用逆波兰表达式就可了. 难点: 1. 针对复杂的用户输入环境解析公式,须要注意公式书写不规范.大写和小写.空格等问题,甚至公式出错的推断. 2. 须要解决函数扩展.函数运行等问题. 3. 须要解决地址.地址范围取数,求值问题. 4. 处理括号带来的优先级提升. 5. 解决公式

递归--逆波兰表达式

用递归解决递归形式的问题例题:逆波兰表达式逆波兰表达式是一种把运算符前置的算术表达式(其实一般教科书上称这种表达式为波兰表达式) ,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入:输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数 输出:输出为一行,表达式的值. 简单来说,这种