利用栈实现计算简单乘法除法
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。
输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘法运算符“*”,且没有括号。
所有参与运算的数字均为 0 到 231-1 之间的整数。
输入数据保证这一行只有0~9、+、*这12种字符。
输出描述:
输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于4位时,请只输出最后4位,前导0不输出。
示例1
说明
计算的结果为8,直接输出8。
本题主要思路便是把该算术式的数字存入栈中,同时一个个将符号也存入进去,因为乘法的优先大于加分,如果这个时遇到加分但是栈顶为乘法,这个时候就要取出栈顶元素,同时从数字栈内取出两个相乘再放入
这个操作要一直到栈顶不再是乘法时候。
#include<bits/stdc++.h> using namespace std; int main() { string str; cin>>str; stack<int> nums; stack<char> tags; int l=0; for(int r=0;r<=str.size();r++) { if(str[r]=='+'||str[r]=='*') { long long temp; string h=str.substr(l,r-l); stringstream ss; ss<<h; ss>>temp; nums.push(temp%10000); if(!tags.empty()) { char c=tags.top(); if(c=='*'&&str[r]=='+') { while(!tags.empty()&&tags.top()=='*')//注意如果发现了乘法便要一直乘 { int a=nums.top(); nums.pop(); int b=nums.top(); nums.pop(); nums.push((((a%10000)*(b%10000)))%10000); tags.pop(); } tags.push(str[r]); } else { tags.push(str[r]); } } else { tags.push(str[r]); } l=r+1; } } string h=str.substr(l); stringstream ss; long long temp; ss<<h; ss>>temp; nums.push(temp%10000); /*while(!tags.empty()) { cout<<tags.top(); tags.pop(); }*/ while(!tags.empty()) { int a=nums.top(); nums.pop(); int b=nums.top(); nums.pop(); char c=tags.top(); tags.pop(); if(c=='+') { temp=(a+b)%10000; } else { temp=((a%10000)*(b%10000))%10000; } nums.push(temp); } cout<<nums.top()<<endl; }

浙公网安备 33010602011771号