用栈实现四则表达式运算的一道题

哆小深 2020-10-10 08:11:43
四则运算表达式计算

题目描述
计算非负整常数四则运算表达式,可用的运算符有:+ - * / ( ) 。
输入
一组非负整常数四则运算表达式,每个表达式输入一行,长度不超过1024个字符。
输出
每个表达式的计算结果输出一行,错误的表达式输出error。
样例输入 Copy
12+5
-4-7
3-*5
((12-3)/2)+5
3+7/(2-2)
样例输出 Copy
17
error
error
9
error


我的思路算法流程:
E1:设立运算符栈和操作数栈;
E2:开始运算符#入栈,向表达式串尾添加结束运算符#;
E3:逐词读入表达式,并处理:
E31:若读入为操作数,则入栈;
E32:若读入为运算符,则与栈顶运算符相比较:
E321:若栈顶运算符优先级高于读入运算符:
弹出栈顶运算符和两个操作数,计算并将结果入栈,执行步骤E32;
E322:若栈顶运算符优先级低于读入运算符:
则将读入运算符入栈,执行步骤E3;
E323:若栈顶运算符优先级等于读入运算符:
若为#,计算结束,若为括号,则弹出运算符,执行步骤E3。
E4:检查栈状态,得到计算结果;


下面是我的代码 主要是一方面我想不到该如何解决优先级的设定问题 是像我这样用函数值大小标记比较吗? 又或者应该怎么解决呢?
求前辈帮忙修改&思路。


#include<bits/stdc++.h>
using namespace std;
int flag(char c){
int ret=0;
switch(c){
case '+': ret=1; break;
case '-': ret=1; break;
case '*': ret=2; break;
case '/': ret=2; break;
case '(': ret=3; break;
// case ')': ret=3; break;
default: break;
}
return ret;
}
int main(){
stack<int> s1;
stack<char> s2;
char z='#';
s2.push(z);
string x;
cin>>x;
x+="#";

e3: for(int i=0;i<x.length();i++){
char c=x[i];
if(isdigit(c)){
if(flag(s2.top())>flag(c)){
char y=s2.top(); s2.pop();
int x1=s1.top(); s1.pop();
int x2=s1.top(); s1.pop();
switch(y){
case '+': s1.push(x1+x2); break;
case '-': s1.push(x1-x2); break;
case '*': s1.push(x1*x2); break;
case '/': s1.push(x1/x2); break;
// case '(': ret=3; break;
// case ')': ret=3; break;
default: break;
}
goto e3;
}
else if(flag(s2.top())<flag(c)){
s2.push(c);
continue;
}
else if(flag(s2.top())==flag(c)){
if(c=='#') break;
if(c=='('||c==')'){
s2.pop();
continue;
}
}
}
else{
s1.push(c);
}
}

while(!s1.empty()){
cout<<s1.top();
s1.pop();
}

return 0;
}

...全文
840 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-09
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
qybao 2020-10-11
  • 打赏
  • 举报
回复
转后缀表达式再计算
下载代码方式:https://pan.quark.cn/s/7981b2df3260 C语言中有一道练习,主要讲解如何构建栈以及如何运用栈来执行一系列操作。这道目包含了关于加减乘除和括号优先级的考虑,以及入栈和出栈的规则,目的是为了实现中缀表达式的计算。栈作为数据结构中的一个核心组成部分,通过这道目我们可以更深入地理解栈的功能,并且熟练掌握在C语言中如何使用栈。中缀表达式求值是编程领域中一个常见的问,它依赖于栈这一数据结构的概念。本任务的核心是设计一个程序,能够接收一个中缀表达式(该表达式包含加法、减法、乘法、除法以及括号),然后计算该表达式的最终结果。为了达成这个目标,我们需要明确栈的特性以及中缀表达式转换为后缀表达式的具体方法。我们需要建立两个栈:一个用于存放操作数(numbers),另一个用于存放运算符(operators)。栈是一种后进先出(LIFO)的数据结构,非常适合用来处理括号和运算符的优先级问。`compare()`函数是整个处理流程的主逻辑,它会依次遍历输入的中缀表达式。当遇到操作数时,将操作数推入操作数栈。当遇到运算符时,需要依据运算符的类型来决定处理方式。如果遇到左括号 (,所有随后的操作数或左括号都将被推入运算符栈,直到遇到右括号 ),此时需要弹出入栈顶的所有运算符,直到遇到左括号为止。运算符的优先级由 `change()` 函数决定,其中 # 代表表达式的结束,) 的优先级最高,其次是 + -,再次是 * /,最后是 (。`yunsuan()`函数负责执行实际的运算操作。它从操作数栈中弹出两个数 n1 和 n2,以及一个运算符 op,根据 op 的类型(加、减、乘、除)进行相应的计算,然后将计算结果推回操作数栈。在编程实现方...

65,212

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧