后缀表达式(C++)
后缀表达式,又称逆波兰式。现在从键盘读入一个后缀表达式,只含有0-9组成的运算数及加(+)、减(—)、乘(*)、除(/)四种运算符。
每个运算数之间用一个空格隔开,题目所使用的运算数均小于10,并确保所给的表达式合法。以@作为结束标志。
输入格式
一个后缀表达式。
输出格式
表达式结果。
输入样例
6 9 4 3 +*-@
输出样例
-57
#include<iostream>
#include<stack>
using namespace std;
int main()
{
stack<int>S;//定义一个栈
int a,b,c,ch;
while((ch=getchar())!='@')//输入数据
{
if(ch<='9'&&ch>='0')//挑出数字
S.push(ch-48);//字符型变整型并入栈
else if(ch!=' ')
{
a=S.top();//存起来方便计算
S.pop();
b=S.top();
S.pop();
switch(ch)//符号的判断
{
case '+':c=a+b;break;
case '-':c=b-a;break;//注意进出栈的顺序(a和b)
case '*':c=a*b;break;
case '/':c=b/a;break;//注意进出栈的顺序(a和b)
default :break;
}
S.push(c);//存入栈中
}
}
cout<<S.top();//做完计算后输出
}
运行结果如下:
有朋友私信我:如果输入两位数(甚至多位数)的呢?
其实,原理还是一样的,只要在某些地方做更改即可
思路:用一个char型的vector数组来存字符,遇到空格就处理vector里的字符并进栈,并清空数组(为下一个多位数准备)
代码如下
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
int main()
{
stack<int>S;//定义一个栈
vector<char>some;//定义一个用于存放字符的数组
int a,b,c,ch;
while((ch=getchar())!='@')//输入数据
{
if(ch<='9'&&ch>='0')//挑出数字
{
some.push_back(ch);
}
else if(ch==' ')//遇到空格
{
int all=0;
for(int i=0;i<some.size();i++)
{
all=all*10+(some[i]-48);//字符变整形
}
S.push(all);//整型入栈
some.clear();//!!!!!!!!记得清空数组
}
else//其它符号
{
a=S.top();//存起来方便计算
S.pop();
b=S.top();
S.pop();
switch(ch)//符号的判断
{
case '+':c=a+b;break;
case '-':c=b-a;break;//注意进出栈的顺序(a和b)
case '*':c=a*b;break;
case '/':c=b/a;break;//注意进出栈的顺序(a和b)
default :break;
}
S.push(c);//存入栈中
}
}
cout<<S.top();//做完计算后输出
}