用栈实现四则运算表达式(c++)
来源:互联网 发布:刷qb软件 编辑:程序博客网 时间:2024/05/11 13:22
水平有限,花了两个小时实现了用栈进行基本的四则运算,只针对整数的运算。(即使两个整数相除也将得到整数)
思路:将输入的中缀表达式用栈转化为后缀表达式,再根据后缀表达式用栈实现运算。
中缀表达式:运算符位于运算数中间的表达式。如1+2,3*4
后缀表达式:运算符位于运算数后的表达式。如12+,34*
有中缀,有后缀,当然也有前缀。将中缀转换成前缀表达式然后进行计算与转换成后缀其实完全类似,这里只介绍后者。
(1)
先介绍用栈将中缀表达式转换成后缀表达式
1.建立两个栈 s1, s2.
2.遍历表达式字符串
3.若遇到数字,则直接压入s1
4.若遇到运算符(包括括号)
4(1)若s2为空,或s2栈顶为’(‘,则直接压入s2
4(2)若运算符比s2栈顶的运算符优先级高,则直接压入s2
4(3)若(1)(2)均不成立,则推出s2栈顶元素,将s2的栈顶元素压入s1,再回去进行(1)(2)两步骤
5.若遇到’(‘,则直接压入s2
6.若遇到‘)’,则将s2的元素推出并压入s1,直到s2栈顶出现’(‘,
(2)
根据后缀表达式计算
1.建立一个栈s
2.遍历后缀表达式字符串
3.遇到数字,则直接压入s
4.遇到运算符,则推出s的最上面两个数,根据运算符对两个数进行加减乘除,并将运算结果压回s
5.遍历结束后,最终结果就在栈s顶。
下面是c++代码的具体实现。该代码只是笔者为了练习和理解栈的概念所编写,只是最简单的实现,不包括检错报错和浮点数运算,水平有限,不要用于除研究以外的其他用途。
#include <stack>#include <iostream>#include <string>#include <algorithm>#include <iterator>using namespace std;int compareOperatorPriority(char op1,char op2);string getSuffixExpression(string str);int calculate(string str);bool isDigit(char c);bool isOperator(char c);int main(int argc, char const *argv[]){ /* code */ string input ; cout<<"Please input a exoression: "; cin>>input; cout<<"The input is : "<<input<<endl; input = getSuffixExpression(input); cout<<"The suffix exoression is :" << input << endl; int result = calculate(input); cout<<"The result is "<<result << endl; return 0;}/* *比较两个操作符的优先级,op1比op2高返回1,一样返回0,低返回-1*/int compareOperatorPriority(char op1,char op2){ switch(op1){ case '+': case '-': return (op2 == '*' || op2 == '/'? -1:0); break; case '*': case '/': return (op2 == '-' || op2 == '+'? 1:0); } return -1;}/* *得到后缀表达式*/string getSuffixExpression(string str) { stack<char> numbersAndOperators; stack<char> operators; //开始遍历字符串 for(int i = 0;i<str.length();i++){ if(isDigit(str[i])){ numbersAndOperators.push(str[i]);//如果是数字,则直接进入栈numbersAndOperators }else if(isOperator(str[i])){//如果是操作符 if(operators.empty() || operators.top() == '('){//若栈空或栈顶为( operators.push(str[i]); }else if(compareOperatorPriority(str[i],operators.top())>0){//若操作符比栈顶操作符优先级高 operators.push(str[i]); }else{ while(true){ numbersAndOperators.push(operators.top()); operators.pop(); if(operators.empty() || operators.top() == '('){ operators.push(str[i]); break; }else if(compareOperatorPriority(str[i],operators.top())>0){ operators.push(str[i]); break; } } } } else if(str[i] == '('){ operators.push(str[i]); }else if(str[i] == ')'){ while(operators.top() != '('){ numbersAndOperators.push(operators.top()); operators.pop(); } operators.pop();//丢掉'(' }else { cout<< "Bad Expression!"<<endl; exit(-1); } } while(!operators.empty()){ numbersAndOperators.push(operators.top()); operators.pop(); } string suffix = string(numbersAndOperators.size(),'a'); int i = 0; while(!numbersAndOperators.empty()){ suffix[i] = numbersAndOperators.top(); numbersAndOperators.pop(); i++; } reverse(begin(suffix), end(suffix)); return suffix;}/* *根据后缀表达式计算*/int calculate(string str){ stack<int> numbers; for(int i = 0;i < str.length();i++){ if(isDigit(str[i])){ numbers.push(str[i]-'0'); } else if(isOperator(str[i])){//遇到操作符,取出栈顶2个数字,并计算,计算结果压入栈 int a = numbers.top(); numbers.pop(); int b = numbers.top(); numbers.pop(); int tempResult; if(str[i] == '+'){ tempResult = b + a; }else if(str[i] == '-'){ tempResult = b - a; //这里注意被减数和减数的顺序,不要弄反 }else if(str[i] == '*'){ tempResult = b * a; }else if(str[i] == '/'){ tempResult = b / a; } numbers.push(tempResult); } } return numbers.top();}/* *判断是否为数字 */bool isDigit(char c){ int a = c - '0'; if(a >= 0 && a <= 9){ return true; }else{ return false; }}/* *判断是否为操作符 */bool isOperator(char c){ if( c == '+' || c == '-' || c == '*' || c == '/'){ return true; }else{ return false; }}
0 0
- 用栈实现四则运算表达式(c++)
- <DataStructure_1>用栈实现四则运算(c语言)
- C语言:用栈实现四则运算
- 四则运算(用栈实现)
- 栈的测试--四则运算表达式求值(C语言)
- 用栈实现四则运算
- 栈实现简单的四则运算表达式
- 四则运算表达式实现
- C语言实现表达式求值,支持+、-、*、/四则运算,并且支持多级括号,自定义了栈的操作。
- Linux系统下用C语言实现浮点数四则运算表达式的求值
- C语言实现整数四则运算表达式的计算
- C语言实现 加减乘除四则运算(小数)
- C语言实现四则运算(小型计算器)
- C语言实现四则运算
- 用链式栈实现四则运算
- 四则运算表达式求值(栈的应用)
- 四则运算表达式求值(栈的应用)
- 四则运算表达式求值(栈的应用)
- Linux SSH远程文件/目录传输命令scp
- iOS 函数调用的实现过程
- LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- Java常见的异常总结
- 排序算法十:桶排序
- 用栈实现四则运算表达式(c++)
- 实现短信验证码自动拦截读取
- 删除数组重复元素的方法
- DIV结构的点击收缩展开左边栏代码(html+css+js)
- 【不定期更新】常用下载资源整合
- 幂等策略-尝试插入
- 在Android开发中使用ORMLite--篇一
- Android Hook框架Xposed原理与源代码分析
- Java 多维数组遍历详解