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

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

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

中缀表达式:运算符位于运算数中间的表达式。如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 
#include 
#include 
#include 
#include 
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 : "<cout<<"The suffix exoression is :" << input << endl;
    int result = calculate(input);
    cout<<"The result is "<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;iif(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!"<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;
    }
}

你可能感兴趣的:(数据结构)