用栈实现四则运算表达式(c++)

来源:互联网 发布:刷qb软件 编辑:程序博客网 时间:2024/05/11 13:22

水平有限,花了两个小时实现了用栈进行基本的四则运算,只针对整数的运算。(即使两个整数相除也将得到整数)

思路:将输入的中缀表达式用栈转化为后缀表达式,再根据后缀表达式用栈实现运算。

中缀表达式:运算符位于运算数中间的表达式。如1+2,3*4
后缀表达式:运算符位于运算数后的表达式。如12+,34*

有中缀,有后缀,当然也有前缀。将中缀转换成前缀表达式然后进行计算与转换成后缀其实完全类似,这里只介绍后者。

(1)
先介绍用栈将中缀表达式转换成后缀表达式
1.建立两个栈 s1, s2.
2.遍历表达式字符串
3.若遇到数字,则直接压入s1
4.若遇到运算符(包括括号)
4(1)若s2为空,或s2栈顶为’(‘,则直接压入s2
4(2)若运算符比s2栈顶的运算符优先级高,则直接压入s2
4(3)若(1)(2)均不成立,则推出s2栈顶元素,将s2的栈顶元素压入s1,再回去进行(1)(2)两步骤
5.若遇到’(‘,则直接压入s2
6.若遇到‘)’,则将s2的元素推出并压入s1,直到s2栈顶出现’(‘,

(2)
根据后缀表达式计算
1.建立一个栈s
2.遍历后缀表达式字符串
3.遇到数字,则直接压入s
4.遇到运算符,则推出s的最上面两个数,根据运算符对两个数进行加减乘除,并将运算结果压回s
5.遍历结束后,最终结果就在栈s顶。

下面是c++代码的具体实现。该代码只是笔者为了练习和理解栈的概念所编写,只是最简单的实现,不包括检错报错和浮点数运算,水平有限,不要用于除研究以外的其他用途。

#include <stack>#include <iostream>#include <string>#include <algorithm>#include <iterator>using namespace std;int compareOperatorPriority(char op1,char op2);string getSuffixExpression(string str);int calculate(string str);bool isDigit(char c);bool isOperator(char c);int main(int argc, char const *argv[]){    /* code */    string input ;    cout<<"Please input a exoression: ";    cin>>input;    cout<<"The input is : "<<input<<endl;    input = getSuffixExpression(input);    cout<<"The suffix exoression is :" << input << endl;    int result = calculate(input);    cout<<"The result is "<<result << endl;    return 0;}/* *比较两个操作符的优先级,op1比op2高返回1,一样返回0,低返回-1*/int compareOperatorPriority(char op1,char op2){    switch(op1){        case '+': case '-':            return (op2 == '*' || op2 == '/'? -1:0);            break;        case '*': case '/':            return (op2 == '-' || op2 == '+'? 1:0);    }    return -1;}/* *得到后缀表达式*/string getSuffixExpression(string str) {    stack<char> numbersAndOperators;    stack<char> operators;    //开始遍历字符串    for(int i = 0;i<str.length();i++){        if(isDigit(str[i])){            numbersAndOperators.push(str[i]);//如果是数字,则直接进入栈numbersAndOperators        }else if(isOperator(str[i])){//如果是操作符            if(operators.empty() || operators.top() == '('){//若栈空或栈顶为(                operators.push(str[i]);            }else if(compareOperatorPriority(str[i],operators.top())>0){//若操作符比栈顶操作符优先级高                operators.push(str[i]);            }else{                while(true){                    numbersAndOperators.push(operators.top());                    operators.pop();                    if(operators.empty() || operators.top() == '('){                        operators.push(str[i]);                        break;                    }else if(compareOperatorPriority(str[i],operators.top())>0){                        operators.push(str[i]);                        break;                    }                }            }        }        else if(str[i] == '('){            operators.push(str[i]);        }else if(str[i] == ')'){            while(operators.top() != '('){                numbersAndOperators.push(operators.top());                operators.pop();            }            operators.pop();//丢掉'('        }else {            cout<< "Bad Expression!"<<endl;            exit(-1);        }    }    while(!operators.empty()){        numbersAndOperators.push(operators.top());        operators.pop();    }    string suffix = string(numbersAndOperators.size(),'a');    int i = 0;    while(!numbersAndOperators.empty()){        suffix[i] = numbersAndOperators.top();        numbersAndOperators.pop();        i++;    }    reverse(begin(suffix), end(suffix));    return suffix;}/* *根据后缀表达式计算*/int calculate(string str){    stack<int> numbers;    for(int i = 0;i < str.length();i++){        if(isDigit(str[i])){            numbers.push(str[i]-'0');        }        else if(isOperator(str[i])){//遇到操作符,取出栈顶2个数字,并计算,计算结果压入栈            int a = numbers.top();            numbers.pop();            int b = numbers.top();            numbers.pop();            int tempResult;            if(str[i] == '+'){                tempResult = b + a;            }else if(str[i] == '-'){                tempResult = b - a; //这里注意被减数和减数的顺序,不要弄反            }else if(str[i] == '*'){                tempResult = b * a;            }else if(str[i] == '/'){                tempResult = b / a;            }            numbers.push(tempResult);        }    }    return numbers.top();}/* *判断是否为数字 */bool isDigit(char c){    int a = c - '0';    if(a >= 0 && a <= 9){        return true;    }else{        return false;    }}/* *判断是否为操作符 */bool isOperator(char c){    if( c == '+' || c == '-' || c == '*' || c == '/'){        return true;    }else{        return false;    }}
0 0