coder  •  3个月前


#include <iostream>
#include "strings.h"

using namespace std;
template<class T>
class ArrStack{
public:
    T *arr;
    int MAXSIZE;
    int top = -1;
public:
    ArrStack(int maxsize){
        this->MAXSIZE = maxsize;
        arr = new T[this->MAXSIZE];
    }
    bool isFull(){
        return top == MAXSIZE-1;
    }
    bool isEmpty(){
        return top == -1;
    }
    void push(int value){

        if(isFull()){
            cout<<"栈满"<<endl;
            return;
        }

        top++;
        arr[top] = value;
    }

    //出栈
    int pop(){
        if (isEmpty()){
            throw new runtime_error("栈空\n");
        }
        int t;
        t = arr[top];
        top--;
        return t;
    }
    void show(){
        for (int i = top; i >= 0 ; --i) {
            cout<<i<<": "<<arr[i]<<"  ";
        }
        cout<<"\n";
    }

    //获取栈顶元素,不出栈
    int getTop(){
        return arr[top];
    }


    //操作符优先级判断
    int priority(char oper){
        if (oper == '*'||oper=='/'){
            return 1;
        } else if (oper == '+'||oper=='-'){
            return 0;
        } else{
            return -1;
        }
    }
    //判断是否是一个运算符
    bool isOper(char op){
        return op=='+'||op=='-'||op=='*'||op=='/';
    }
    /**
     *
     * @param num1 操作数1
     * @param num2 操作数2
     * @param op 运算符
     * @return
     */
    int cal(int num1, int num2,char op){
        int res = 0;
        switch (op) {
            case '+':
                res = num1+num2;
                break;
            case '-':
                res = num2-num1;
                break;
            case '*':
                res = num1*num2;
                break;
            case '/':
                res = num2/num1;
                break;
            default:
                break;
        }

        return res;
    }
};
int main() {
    string exp
    ;
    cin>>exp;
    //创建两个栈   数字栈  符号栈
    ArrStack<int> numarr(exp.size());
    ArrStack<char> oparr(exp.size());
    int index = 0;//用于扫描
    int num1 = 0;
    int num2  = 0;
    char op = ' ';
    int res = 0;
    char ch = ' ';//每次扫描的
    while (true){
        ch = exp[index];
        if (oparr.isOper(ch)){//如果是运算符
            //判断符号栈是否为空
            if (!oparr.isEmpty()){
                //处理
                if (oparr.priority(ch)<=oparr.priority(oparr.getTop())){//符号栈中的元素优先级 大于等于 当前扫描到的元素
                    num1=numarr.pop();
                    num2  = numarr.pop();
                    op = oparr.pop();
                    res = numarr.cal(num1 , num2,op);
                    //运算结果入数栈
                    numarr.push(res%10000);
                    //当前操作符入栈
                    oparr.push(ch);
                } else{//符号栈中的元素小于单钱扫描到的元素
                    oparr.push(ch);
                }
            } else{//符号栈为空,直接入栈
                oparr.push(ch);
            }
        } else{
            int t = 0;
            while (!oparr.isOper(exp[index])&&index<exp.size()){
                t  =t*10+(exp[index]-48);
                index++;
            }
            numarr.push(t%10000);
            index--;
        }
        index++;
        if (index>=exp.size()){
            break;
        }
    }
    while (true){
        //如果符号栈为空。则计算结束 , 数栈中只有一个数值
        if(oparr.isEmpty()){
            break;
        }else{
            num1=numarr.pop();
            num2  = numarr.pop();
            op = oparr.pop();
            res = numarr.cal(num1 , num2,op);
            //运算结果入数栈
            numarr.push(res%10000);
        }
    }
//    printf("表达式结果为:%d",numarr.getTop());
        printf("%d",numarr.getTop()%10000);
    return 0;
}

评论:

请先登录,才能进行评论