P1449 后缀表达式

题目描述

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

本题中运算符仅包含 +-*/。保证对于 / 运算除数不为 0。特别地,其中 / 运算的结果需要向 0 取整(即与 C++ / 运算的规则一致)。

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

输入格式

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

输出格式

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

输入输出样例

输入 

3.5.2.-*7.+@

输出 

16

输入 

10.28.30./*7.-@

输出 

-7

说明/提示

数据保证,1≤∣s∣≤50,答案和计算过程中的每一个值的绝对值不超过 109。

代码

无注释版

#include
using namespace std;
int main(){
	stack s;
	char c;
	int num=0;
	while(cin>>c&&c!='@'){
		if(c>='0'&&c<='9'){
			num=num*10+c-'0';
		}
		else if(c=='.'){
			s.push(num);
			num=0;
		}
		else{
			int b=s.top();
			s.pop();
			int a=s.top();
			s.pop();
			if(c=='+'){
				s.push(a+b);
			}
			else if(c=='-'){
				s.push(a-b);
			}
			else if(c=='*'){
				s.push(a*b);
			}
			else s.push(a/b);
		}
	}
	cout<

有注释版 

#include 
using namespace std;

int main() {
    stack s;      // 用于存储操作数的栈
    char c;            // 当前读取的字符
    int num = 0;       // 临时保存当前正在读取的数字(多位)

    while (cin >> c && c != '@') {  // 读取字符直到遇到结束符 '@'
        if (c >= '0' && c <= '9') {
            // 如果是数字字符,构造整数(支持多位数)
            num = num * 10 + (c - '0');
        }
        else if (c == '.') {
            // 一个完整的整数读完了,压入栈中
            s.push(num);
            num = 0;  // 重置 num 以读取下一个数字
        }
        else {
            // 是运算符,弹出两个操作数(注意先后顺序)
            int b = s.top(); s.pop();  // 第二个操作数(在后)
            int a = s.top(); s.pop();  // 第一个操作数(在前)

            // 根据运算符进行计算并将结果压回栈中
            if (c == '+') {
                s.push(a + b);
            }
            else if (c == '-') {
                s.push(a - b);
            }
            else if (c == '*') {
                s.push(a * b);
            }
            else if (c == '/') {
                s.push(a / b);  // 整数除法,向 0 取整(C++ 默认行为)
            }
        }
    }

    // 输出结果,即栈顶的最终计算值
    cout << s.top();
}

你可能感兴趣的:(洛谷,算法,数据结构,c++)