洛谷P1449 后缀表达式
作者:互联网
题目链接:https://www.luogu.com.cn/problem/P1449
题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。
输入格式
输入:后缀表达式
输出格式
输出:表达式的值
输入输出样例
输入 3.5.2.-*7.+@ 输出 16
解题思路:
1栈 后缀表达式
2后缀表达式的计算方式非常简单,遇到数字直接入栈,遇到运算符不入栈并将栈顶和栈顶下面一个两个数字出栈,先出的数在运算符右边,后出的在左边,进行运算,将运算结果入栈,直到最后栈中只剩下最后一个数,输出既是答案。
3'.'有什么用,注意到并不是所有数都是一位数
将数字字符转换成对应的数值的原理:
while(ch>='0'&&ch<='9'&&flag) /*判定为数字字符*/
{ d=10*d+ch-'0';
}
ch-'0'是计算每个数字字符在数字中所对应的位置,较难理解的是10*d ,因为输入的是多个数,每次计算完一个数字字符,依然处在循环中带入下一次的计算,因此10*d的作用就是把上一次算得的结果往高位送,每乘以一个十就高一位。
参考代码:
#include <iostream>
#include<stack>
using namespace std;
int main()
{
stack<int> n;//栈 后缀表达式 是数字进栈 遇到运算符进行栈顶和次顶的运算
char c;
int ans,x,y;
while(c!='@')
{
c=getchar();
switch(c)
{
case '+':x=n.top();n.pop();y=n.top();n.pop();n.push(x+y);break;
case '-':x=n.top();n.pop();y=n.top();n.pop();n.push(y-x);break;
case '*':x=n.top();n.pop();y=n.top();n.pop();n.push(x*y);break;
case '/':x=n.top();n.pop();y=n.top();n.pop();n.push(y/x);break;
case '.':n.push(ans);ans=0;break;
default :ans=ans*10+c-'0';break;
//数字进zhan时 字符转换为数zhi,由于有可能有多位数
多了一位,前面的乘以10
}
}
cout<<n.top();
return 0;
}
标签:case,洛谷,后缀,top,pop,P1449,break,表达式 来源: https://www.cnblogs.com/LuoJMeng/p/16062418.html