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

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

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

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

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

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

#define FOR(i,k,n) for(int i=k;i fu;//符号栈,只会存在(+-*/五种
stack 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<




你可能感兴趣的:(蓝桥杯,数据结构,栈)