思路:
直接读入字符串,判断运算符进行加或乘并压入栈中
最后逐个出栈累加即可
程序注释中有详细解释
(注意%10000)
(程序里定义的stack类可以用std::stack替代)
#include <cctype>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
class stack {
int a[100001], head, tail; //定义栈数据域、头指针、尾指针(其实可以用STL)
public:
void init()
{
head = 0;
tail = 0;
} //将头尾指针都初始化为0
void push(int n)
{
a[tail] = n; //将n存入数据域中
tail++; //尾指针后移一位
}
int pop()
{
tail--; //尾指针前移一位
int t = a[tail]; //获得尾指针所指的数据
return t; //返回数据
}
bool isempty()
{
return head == tail;
} //判断栈是否已空
} stk;
int main()
{
long long t = 0; //存储答案
int tt = 0; //存储读入数字的缓冲区
bool flag = false; //标记乘号
string s;
cin >> s; //读入表达式
s += '+'; //在表达式末尾添加加号
for (int i = 0; i <= s.length() - 1; i++) //在表达式的每一位中
{
if (isdigit(s[i])) tt = tt * 10 + (s[i] - '0'); //如果这一位是数字则累加入缓冲区中
if (flag && !isdigit(s[i])) //如果缓冲区数字已读完且数字前是乘号
{
tt = tt % 10000 * stk.pop(); //弹出栈顶元素累乘
flag = false; //取消乘号标记
}
if (s[i] == '+') {
stk.push(tt % 10000);
tt = 0;
} //如果是加号则将缓冲区数字压入栈中
if (s[i] == '*') {
flag = true;
stk.push(tt % 10000);
tt = 0;
} //如果是乘号则将缓冲区数字压入栈中并标记乘号
}
while (!stk.isempty())
t += stk.pop(); //累加栈内元素
cout << t % 10000 << endl;
return 0;
}