Luogu P1981 表达式求值

思路:

直接读入字符串,判断运算符进行加或乘并压入栈中

最后逐个出栈累加即可

程序注释中有详细解释

(注意%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;
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇