洛谷P1449 后缀表达式

文章目录

  • 后缀表达式
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
  • 题意解析
  • 思路
  • CODE



后缀表达式

题目链接:后缀表达式。

题目描述

所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。

如: 3*(5-2)+7 \texttt{3*(5-2)+7} 3*(5-2)+7 对应的后缀表达式为: 3.5.2.-*7.+@ \texttt{3.5.2.-*7.+@} 3.5.2.-*7.+@。在该式中,@ 为表达式的结束符号。. 为操作数的结束符号。

输入格式

输入一行一个字符串 s s s,表示后缀表达式。

输出格式

输出一个整数,表示表达式的值。

样例 #1

样例输入 #1

3.5.2.-*7.+@

样例输出 #1

16

提示

数据保证, 1 ≤ ∣ s ∣ ≤ 50 1 \leq |s| \leq 50 1s50,答案和计算过程中的每一个值的绝对值不超过 1 0 9 10^9 109



题意解析

将括号去除,把运算符放在两个运算元素的后面,数字后面用'.'来确定结束,最后用@标记结尾。


思路

每次读入一个字符,如果是数字就进行处理运算直到遇见.,如果是.就直接将处理后的数字压入栈内,然后记得清空数字,如果是其他运算符就弹出两个数进行相应运算。


CODE

#include 
#include 
#include 

using namespace std;

const int N = 55;
char s;
int num, stk[N], tt = -1;

int main(){
	s = getchar();
	while(s != '@'){
		if(s <= '9' && s >= '0'){
			num = num * 10 + (s - '0');
		}else if(s == '.'){
			stk[++tt] = num;
			num = 0;
		}else if(s == '+'){
			int a = stk[tt--];
			int b = stk[tt--];
			a = a + b;
			stk[++tt] = a;
		}else if(s == '-'){
			int a = stk[tt--];
			int b = stk[tt--];
			a = b - a;
			stk[++tt] = a;
		}else if(s == '*'){
			int a = stk[tt--];
			int b = stk[tt--];
			a = a * b;
			stk[++tt] = a;
		}else{
			int a = stk[tt--];
			int b = stk[tt--];
			a = b / a;
			stk[++tt] = a;
		}
		s = getchar();
	}
	
	cout << stk[tt--];
} 

不想写这篇解题报告,真的很弱智啊,可是弱智的我一开始没写出来 <_>
一开始读入整个字符串,锁定数字变得极其麻烦,直接一整个呆掉,蒟蒻是这样的。

你可能感兴趣的:(解题报告,#,栈,笔记)