coder  •  3个月前


include

include "strings.h"

using namespace std; template 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;

}


评论:

请先登录,才能进行评论