栈的三大应用例题:
(1)逆波兰式:一个数字栈
链接:(63条消息) 【数据结构】NOJ008—逆波兰式_杨的博客-CSDN博客
(2)中缀表达式计算:一个数字栈和一个运算符栈
链接:(63条消息) 【数据结构】【拓展题】【01】中缀表达式计算_杨的博客-CSDN博客
(3)逆波兰式计算:一个数字栈
链接:(63条消息) 【数据结构】【拓展题】【02】逆波兰式计算_杨的博客-CSDN博客
题目简述:
输入一个逆波兰式,输出其计算结果。同时需注意,所有的数字均是一位数。
输入:
1231+*+
输出:
9
输入:
123*+34*+
输出:
19
解析:
也是经典的利用栈解决问题,其实不难。
只需要一个栈。遇到数字就将它压入栈,遇到一个运算符,说明此时需要计算,且必然是最前面两个数据,就直接拿出栈顶前两个元素计算即可。然后将计算结果入栈。记得刚刚用过的两个都要出栈。最后栈里只剩一个计算结果。
重点:
理清思路,其实很简单。
代码:
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<stack>
using namespace std;
void Calculate_Expr(string str,int len,stack<int>stk)
{
for(int i=0;i<len;i++)
{
if(isdigit(str[i]))
stk.push(int(str[i]-'0'));
else if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')
{
int t1,t2;
t1=stk.top();
stk.pop();
t2=stk.top();
stk.pop();
if(str[i]=='+')
stk.push(t1+t2);
else if(str[i]=='-')
stk.push(t1-t2);
else if(str[i]=='*')
stk.push(t1*t2);
else if(str[i]=='/')
stk.push(t1/t2);
else
cout<<"运算符错误"<<endl;
}
else
{
cout<<"表达式有误"<<endl;
return;
}
}
if(!stk.empty())
cout<<stk.top()<<endl;
else
cout<<"无结果,计算出错!"<<endl;
}
int main()
{
stack<int>stk;
while(!stk.empty())
stk.pop();
string str;
cin>>str;
int len=str.size();
Calculate_Expr(str,len,stk);
return 0;
}