1.构造后缀表达式
- 利用stack,存储操作符;自定义一个数据结构,存放val 和 op;
- 入栈的操作符优先级要高于栈顶的操作符。如果当前op优先级低,则需要把栈顶的op先出栈,再入栈
- 有可能输入的字符大于9, 则需要判断:从字符串中找出数字的计算方法
https://blog.youkuaiyun.com/liqiutuoyuan/article/details/72854471
2.利用后缀表达式计算值
- 利用stack 存储值
- 遇到op,就出栈两个元素。注意先出栈的是被减数。
https://blog.youkuaiyun.com/yangquanhui1991/article/details/52187375
struct node{
char op=NULL;
int val=INT_MIN;
};
int main(){
char ch[20];
cin >> ch;
cout<< *ch;
stack<char> op;
vector<node> express;
int i = 0;
while(ch[i]!='\0'){
node temp;
if('0' <= ch[i] && ch[i] <= '9'){ //数字 从字符串中找出数字的计算方法
int num = 0;
while('0' <= ch[i] && ch[i] <= '9'){
num = num *10 +ch[i] -'0';
i++;
}
i--;
temp.val = num;
express.push_back(temp);
}else{// 操作符 “+” “-” ; “)” ; “(”, “*” “/"
if(!op.empty() && (op.top() == '*' || op.top() == '/') && (ch[i] == '+' || ch[i] == '-')){
while(!op.empty() && (op.top() == '*' || op.top() == '/')){
temp.op = op.top();
op.pop();
express.push_back(temp);
}
op.push(ch[i]);
}else if(ch[i] == ')'){
while(!op.empty() && op.top() != '('){
temp.op = op.top();
express.push_back(temp);
op.pop();
}
op.pop();
}else{
op.push(ch[i]);
}
}
i++;
}
while(!op.empty()){
node temp;
temp.op =op.top();
express.push_back(temp);
op.pop();
}
//计算后缀表达式
stack<int> s;
for(int i = 0; i < express.size(); i++){
if(express[i].val!=INT_MIN){
s.push(express[i].val);
}else{
int b = s.top();
s.pop();
int a = s.top();
s.pop();
cout<< a << " " << b << " " << express[i].op << endl;
switch(express[i].op){
case '+':s.push(a+b); break;
case '-':s.push(a-b); break;
case '*':s.push(a*b); break;
case '/':s.push(a/b); break;
default: break;
}
}
}
cout<< s.top()<<endl;
}
本文探讨了如何使用后缀表达式进行四则运算。首先介绍了如何构造后缀表达式,通过栈来存储操作符,并确保入栈的操作符优先级高于栈顶的。对于数字的识别,需要特别处理大于9的情况。接着讲解了如何利用后缀表达式计算值,通过栈存储数值,遇到操作符时出栈两个元素进行计算,注意运算顺序。
2万+

被折叠的 条评论
为什么被折叠?



