码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-05-01 16:57:51      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:ide   else   ==   bre   turn   oid   桌面   div   VID   

#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==\n)
        {
            compute1();
            cout << v1.back() << endl;
            v1.pop_back();
        }
    }    
} 

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

 

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

标签:ide   else   ==   bre   turn   oid   桌面   div   VID   

原文地址:https://www.cnblogs.com/lhb666aboluo/p/12813738.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!