其他分享
首页 > 其他分享> > 洛谷P1449 后缀表达式

洛谷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