简易桌面计算器 之 用双栈计算中缀表达式的值

Posted lhb666aboluo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简易桌面计算器 之 用双栈计算中缀表达式的值相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

vector<int> v1;
vector<char> v2;
int a;
int b;

void compute1()
{
    while(!v2.empty()&&v2.back()!=()
    {
        a= v1.back();
        v1.pop_back();
        b= v1.back();
        v1.pop_back();
        if(v2.back()==+)    
            b+=a;
        else if(v2.back()==-)
            b-=a;
        else if(v2.back()==*)
            b*=a;
        else if(v2.back()==/){
            if(a==0){
                cout << "can not be divided by zero";
                return;
            }
            b/=a;
        }
        else if(v2.back()==^)
            b=pow(b,a);                      
        v1.push_back(b);
        v2.pop_back();
    }
}

void compute2()
{
    while(!v2.empty()&&v2.back()!=()
    {
        if(v2.back()==*||v2.back()==/||v2.back()==^)
        {
            a= v1.back();
            v1.pop_back();
            b= v1.back();
            v1.pop_back();
            if(v2.back()==*)
                b*=a;
            else if(v2.back()==/){
                if(a==0){
                    cout << "can not be divided by zero";
                    return;
                }
                b/=a;
            }
            else if(v2.back()==^)    
                b=pow(b,a);
            v1.push_back(b);
            v2.pop_back();
        }    
        else 
            break;        
    }
}

void infix()
{
    char c;
    int num;
    while(cin.get(c))
    {
        if(isdigit(c))
        {
            cin.putback(c);
            cin>>num;
            v1.push_back(num);
        }    
        else if(c==+||c==-||c==*||c==/||c==^||c==(||c==))
        {
            switch(c)
            {
                case +:
                    compute1();
                    v2.push_back(c);
                    break;
                case -:
                    compute1();
                    v2.push_back(c);
                    break;
                case *:
                    compute2();
                    v2.push_back(c);
                    break;
                case /:
                    compute2();
                    v2.push_back(c);
                    break;
                case ^:
                    v2.push_back(c);
                    break;
                case (:
                    v2.push_back(c);
                    break;
                case ):
                    compute1();
                    v2.pop_back();
                    break;
            }
        }
        else if(c==
)
        {
            compute1();
            cout << v1.back() << endl;
            v1.pop_back();
        }
    }    
} 

int main()
{
    infix();
    return 0;
}

 

以上是关于简易桌面计算器 之 用双栈计算中缀表达式的值的主要内容,如果未能解决你的问题,请参考以下文章

数据结构-栈的应用之中缀表达式的计算

数据结构-栈的应用之中缀表达式的计算

数据结构-栈的应用之中缀表达式的计算

项目——简易计算器

栈应用之中缀表达式计算C#实现

中缀转逆波兰然后计算表达式的值