蓝桥杯 ALGO-156 表达式计算(栈)

题目链接:http://lx.lanqiao.cn/problem.page?gpid=T419

题意:计算表达式,只包含加减乖除和括号,其中除表示整除。

解题方案:通过两个栈,一个符号栈和一个数值栈将中缀表达式转换成后缀表达式并计算。

代码参考:http://www.cnblogs.com/z-y-p/p/3676945.html

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>

using namespace std;

#define FOR(i,k,n) for(int i=k;i<n;i++)
#define FORR(i,k,n) for(int i=k;i<=n;i++)
#define scan(a) scanf("%d",&a)
#define scann(a,b) scanf("%d%d",&a,&b)
#define scannn(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define mst(a,n)  memset(a,n,sizeof(a))
#define ll long long
#define N 505
#define mod 1000000007
#define INF 0x3f3f3f3f

const double eps=1e-8;
const double pi=acos(-1.0);

string s;
stack<char> fu;//符号栈,只会存在(+-*/五种
stack<int> shu;//数值栈

void js1()//碰到+-)这三个优先级低的,将符号栈中的符号全部取出计算,直到碰到符号栈中的(
{
    while(fu.top()!='(')
    {
        int n1=shu.top(); shu.pop();
        int n2=shu.top(); shu.pop();
        char op=fu.top(); fu.pop();
        switch(op)
        {
            case '+':
                n2+=n1;
                break;
            case '-':
                n2-=n1;
                break;
            case '*':
                n2*=n1;
                break;
            case '/':
                n2/=n1;
                break;
        }
        shu.push(n2);
    }
}
void js2()//碰到*/这两个优先级高的,只将栈顶的*/取出来计算
{
    while(fu.top()=='*'||fu.top()=='/')
    {
        int n1=shu.top(); shu.pop();
        int n2=shu.top(); shu.pop();
        char op=fu.top(); fu.pop();
        switch(op)
        {
            case '*':
                n2*=n1;
                break;
            case '/':
                n2/=n1;
                break;
        }
        shu.push(n2);
    }
}
int main()
{
    cin>>s;
    s='('+s+')';//加入左边界,省去栈空判断
                //加入右边界,从而使表达式遍历完后,弹出数值栈和符号栈最后的内容进行计算
    for(int i=0;s[i];i++)
    {
        if(s[i]>='0'&&s[i]<='9')
        {
            int n=0;
            while(s[i]>='0'&&s[i]<='9') n=n*10+s[i]-'0',i++;
            shu.push(n);
        }

        switch(s[i])
        {
            case '+':
                js1();
                fu.push(s[i]);
                break;
            case '-':
                js1();
                fu.push(s[i]);
                break;
            case '*':
                js2();
                fu.push(s[i]);
                break;
            case '/':
                js2();
                fu.push(s[i]);
                break;
            case '(':
                fu.push(s[i]);
                break;
            case ')':
                js1();
                fu.pop();
                break;
        }


    }
    cout<<shu.top()<<endl;
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值