zoukankan      html  css  js  c++  java
  • 用栈实现四则运算

    //************ 课本53页,用栈来实现的简单的四则运算表达式. '#'是表达式结束符,
                  注意在表达式输入完毕后需再输入一个'#'表示结束.  eg:4+2*3-10/5#   **********//
    #include<stdio.h>
    #include <iostream>
    #include <string>
    #include <cstring>
    #include <stack>
    using namespace std;
    stack<int> opnd;        //操作数栈
    stack<char> optr;        //算符栈
    char expression[100];    //用于盛放表达式
    char Compare(char a, char b);            //返回两算符a和b的优先级关系
    int Calculate(int a, int b, char op);    //返回计算结果
    int EvaluateExpression();                //求值过程
    bool IsOptr(char c);                    //是否是算符
    int main(){
        optr.push('#');                        //在表达式最左边增设一个'#'构成整个表达式的一对'#'
        while(scanf("%s", expression) != EOF)
            cout<<EvaluateExpression()<<endl;
        return 0;
    }
    char Compare(char a, char b){            //返回两算符a和b的优先级关系
        if('#' == a)
            if('#' == b)
                return '=';
            else
                return '<';
        if('+'==a || '-'==a)
            if('*'==b || '/'==b || '('==b)
                return '<';
            else
                return '>';
    
        if('*'==a || '/'==a)
            if('(' == b)
                return '<';
            else
                return '>';
    
        if('(' == a)
            if(')' == b)
                return '=';
            else
                return '<';
    }
    int Calculate(int a, int b, char op)    //返回计算结果
    {
        switch(op)    {
            case '+':
                return a+b;
            case '-':
                return a-b;
            case '*':
                return a*b;
            case '/':
                return a/b;
        }
    }
    bool IsOptr(char c){
        static string oprator("+-*/()#");
        if(oprator.find(c) == string::npos)
            return false;    //不是算符
        return true;        //是算符
    }
    int EvaluateExpression(){                //求值过程
        int i=0, num=0;
        while(expression[i]!='#' || optr.top()!='#'){
            if(!IsOptr(expression[i])){
        //不是算符,则是操作数
                num = 0;
                while(!IsOptr(expression[i]))
                {    //求得此操作数
                    num *= 10;
                    num += expression[i]-'0';
                    ++i;
                }
                opnd.push(num);
            }
            else{
                switch(Compare(optr.top(), expression[i])){
                    case '<':
                        optr.push(expression[i]);
                        ++i;
                        break;
                    case '=':
                        optr.pop();
                        ++i;
                        break;
                    case '>':
                        int a = opnd.top(); opnd.pop();
                        int b = opnd.top(); opnd.pop();
                        opnd.push(Calculate(b, a, optr.top()));    //注意这里a和b的顺序
                        optr.pop();
                        break;
                }
            }
        }
        optr.push('#');        //在表达式最左边增设一个'#'构成整个表达式的一对'#'
        int res=opnd.top();
        opnd.pop();
        return res;
    }
  • 相关阅读:
    poj2431 Expedition 题解报告
    poj1017 Packets 题解报告
    UVA714 Copying books 题解报告
    poj3040 Allowance 题解报告
    CH134 双端队列 题解报告
    poj2259 Team Queue 题解报告
    CH128 Editor 题解报告
    基本数据结构专题笔记
    CH109 Genius ACM 题解报告
    线段树总结
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/5036640.html
Copyright © 2011-2022 走看看