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

中缀表达式及计算 栈的应用

时间:2015-03-06 23:30:27      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

 

未整理完..

#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
using namespace std;


struct PostfixExpre {
    string infix;

    PostfixExpre(string _infix) {
        infix = _infix;
    }
    int getPri(char c)
    {
        switch(c){
            case (:
                return 1;
            case +: case -:
                return 2;
            case *: case /:
                return 3;
            case ):
                return 4;
            default://数字返回0
                return 0;
        }
    }

    string getPostfix()
    {
        bool frist = true;
        stack<char>s;
        string post;
        int n = infix.size();
        for(int i=0; i<n; ){
            int pri = getPri(infix[i]);
            switch(pri) {
            case 0://如果是数字,将连续的数字加入后缀
                if(!frist) //用于出去第一个空格
                    post += " ";
                else
                    frist = false;
                while(i<n && !getPri(infix[i]))
                    post += infix[i++];
                break;
            case 1://如果是( 直接入栈
                s.push(infix[i++]);
                break;
            case 2://如果是+ - 需要弹出栈中运算符优先级比infix[i]高或相等的运算符,并加入前缀,然后将infix[i]入栈
                while(!s.empty() && getPri(s.top()) >= 2){
                    post += " ";
                    post += s.top();
                    s.pop();
                }
                s.push(infix[i++]);
                break;
            case 3://如果是* / 弹出栈中运算符优先级比infix[i]高或相等的运算符,并加入前缀,然后将infix[i]入栈
                while(!s.empty() && getPri(s.top()) >= 3){
                    post += " ";
                    post += s.top();
                    s.pop();
                }
                s.push(infix[i++]);
                break;
            case 4://如果是 ) 弹出所有在最近的(之前的运算符,并加入后缀
                while(s.top() != (){
                    post += " ";
                    post += s.top();
                    s.pop();
                }
                s.pop(); // 弹出(
                i++;
            }
        }
        while(!s.empty()){
            post += " ";
            post += + s.top();
            s.pop();
        }
        return post;
    }

    void printstack(stack<int> s)
    {
        while(!s.empty()){
            cout<<s.top()<<" ";
            s.pop();
        }
        cout<<endl;
    }
    bool isSinNum(int ch){
        return ch >= 0 && ch <= 9;
    }
    //通过后缀表达式计算结果 要求后缀表达式格式数字与符号、符号与符号间用空格隔开
    int getValue(string post)
    {
        stack<int>s;
        int n = post.size();
        for(int i=0; i<n; ){
            int res = 0;
            char c = post[i];
            if(c>=0 && c<=9){ //如果是数字,提取所有连续数字,并将该数字入栈
                while(i<n && c !=  ){
                    res = res*10+c-0;
                    c = post[++i];
                }
                s.push(res);
//        printstack(s);
            } else {//是符号,弹出栈前面两个数字,并计算,然后经结果入栈
                int b = s.top(); s.pop();
                int a = s.top(); s.pop();
                switch(c){
                case +: res = a+b; break;
                case -: res = a-b; break;
                case *: res = a*b; break;
                case /: res = a/b; break;
                }
                s.push(res);
//        printstack(s);
                i++;
            }
            i++;//跳过空格
        }
        return s.top();
    }

};





int main(){

    PostfixExpre p("121+10*(53-49+20)/((35-25)*2+10)+11");
    cout<<p.getPostfix()<<endl;
    cout<<p.getValue("121 10 53 49 - 20 + * 35 25 - 2 * 10 + / + 11 +");//140 

    getchar();
    return 0;
}

中缀表达式及计算 栈的应用

标签:

原文地址:http://www.cnblogs.com/vegg117/p/4319365.html

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