首页 > 试题广场 >

表达式求值

[编程题]表达式求值
  • 热度指数:90642 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
请写一个整数计算器,支持加减乘三种运算和括号。

数据范围:,保证计算结果始终在整型范围内

要求:空间复杂度: ,时间复杂度
示例1

输入

"1+2"

输出

3
示例2

输入

"(2*(3-4))*5"

输出

-10
示例3

输入

"3+2*3*4-1"

输出

26
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 返回表达式的值
 * @param s string字符串 待计算的表达式
 * @return int整型
 */
#include <stdio.h>
#include <string.h>
int solve(char* s ) {
    // write code here
    char stack_ops[103];//符号栈
    int stack_val[103];//值栈
    int n = strlen(s);
    int top_val = 0;
    int top_ops = 0;
    int val = 0;
    for (int i = 0; i < n; i++) {
        //取数、存数
        if (s[i] >= '0' && s[i] <= '9') {
            val = 0;
            while (s[i] >= '0' && s[i] <= '9') {
                val = val * 10 + s[i] - '0';
                i++;
            }
            i--;
            stack_val[top_val++] = val;
        }
        //符号
        else {
            //若识别到')',则将最近一个'('到此')'的所有字符出栈,消灭这一对括号
            if (s[i] == ')') {
                while (stack_ops[top_ops - 1] != '(') {
                    int x = stack_val[--top_val];
                    int y = stack_val[--top_val];
                    //注意,此时经过其他步骤,括号里只有一个运算符,可直接运算
                    if (stack_ops[top_ops-1] == '+') {
                        stack_val[top_val++] = x + y;
                    } else if (stack_ops[top_ops-1] == '-') {
                        stack_val[top_val++] = y - x;
                    } else if (stack_ops[top_ops-1] == '*') {
                        stack_val[top_val++] = y * x;
                    }
                    top_ops--;
                }
                top_ops--;
            }
            //若识别到(',入栈
            else if(s[i]=='(')
            {
                stack_ops[top_ops++]='(';
            }
             //若识别到'+',判断优先级,如果栈顶运算符优先级较高,则将其出栈,并
             //进行运算
            else if (s[i]=='+'&&top_val>=2&&stack_ops[top_ops-1]=='*') {
                while (s[i]=='+'&&top_val>=2&&stack_ops[top_ops-1]=='*') {
                    int x = stack_val[--top_val];
                    int y = stack_val[--top_val];
                    stack_val[top_val++] = y*x;
                    top_ops--;
                }
                stack_ops[top_ops++]='+';
            }
            //若识别到'+',看是否为连续加
            else if (s[i]=='+'&&top_val>=2&&stack_ops[top_ops-1]=='+') {
                while (s[i]=='+'&&top_val>=2&&stack_ops[top_ops-1]=='+') {
                    int x = stack_val[--top_val];
                    int y = stack_val[--top_val];
                    stack_val[top_val++] = y+x;
                    top_ops--;
                }
                stack_ops[top_ops++]='+';
            }
            //若识别到'-',判断优先级,如果栈顶运算符优先级较高,则将其出栈,并
             //进行运算
            else if (s[i]=='-'&&top_val>=2&&stack_ops[top_ops-1]=='*') {
                while (s[i]=='-'&&top_val>=2&&stack_ops[top_ops-1]=='*') {
                    int x = stack_val[--top_val];
                    int y = stack_val[--top_val];
                    stack_val[top_val++] = y*x;
                    top_ops--;
                }
                stack_ops[top_ops++]='-';
            }
            //若识别到'-',看是否为连续减
            //注意:连续减要从左往右算,这一步不可省略!!!,否则会出现从右往左减
            //的情况
            else if (s[i]=='-'&&top_val>=2&&stack_ops[top_ops-1]=='-') {
                while (s[i]=='-'&&top_val>=2&&stack_ops[top_ops-1]=='-') {
                    int x = stack_val[--top_val];
                    int y = stack_val[--top_val];
                    stack_val[top_val++] = y-x;
                    top_ops--;
                }
                stack_ops[top_ops++]='-';
            }
            else {
                stack_ops[top_ops++]=s[i];
            }
        }
    }
    //剩下的运算符直接运算
    while (top_ops!=0) {
        int x = stack_val[--top_val];
        int y = stack_val[--top_val];
        if(stack_ops[top_ops-1]=='+')
        {
            stack_val[top_val++] = y+x;
        }
        else if (stack_ops[top_ops-1]=='-') {
            stack_val[top_val++] = y-x;
        }
        else if (stack_ops[top_ops-1]=='*') {
            stack_val[top_val++] = y*x;
        }
        top_ops--;
    }
    return stack_val[0];
}
发表于 2024-10-15 12:46:22 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 返回表达式的值
 * @param s string字符串 待计算的表达式
 * @return int整型
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LEN 100

typedef struct my_stack {
    int arry[MAX_LEN];
    int top;
} my_stack;

typedef struct my_stack_fuhao {
    char arry[MAX_LEN];
    int top;
} my_stack_fuhao;

void init_my_stack(my_stack* s) {
    s->top = -1;
}

void init_my_stack_fuhao(my_stack_fuhao* s) {
    s->top = -1;
}

int is_empty(my_stack* s) {
    return s->top == -1;
}

int is_empty_fuhao(my_stack_fuhao* s) {
    return s->top == -1;
}

void push(my_stack* s, int val) {
    if (s->top < MAX_LEN - 1) {
        //printf("push: %d, s->top: %d\n", val, s->top);
        s->arry[++s->top] = val;
    } else {
        printf("error: stack overflow\n");
    }
}

void push_fuhao(my_stack_fuhao* s, char val) {
    if (s->top < MAX_LEN - 1) {
        s->arry[++s->top] = val;
    } else {
        printf("error: stack overflow\n");
    }
}

int top(my_stack* s) {
    if (!is_empty(s)) {
        return s->arry[s->top];
    } else {
        return 0;
    }
}

char top_fuhao(my_stack_fuhao* s) {
    if (!is_empty_fuhao(s)) {
        return s->arry[s->top];
    } else {
        return 0;
    }
}

int pop(my_stack* s) {
    if (!is_empty(s)) {
        return s->arry[s->top--];
    } else {
        return 0;
    }
}

char pop_fuhao(my_stack_fuhao* s) {
    if (!is_empty_fuhao(s)) {
        return s->arry[s->top--];
    } else {
        return 0;
    }
}

int youxianji_3(char op) {
    if (op == '+' || op == '-') return 1;
    if (op == '*') return 2;
    return 0;
}

int applyOperation(int a, int b, char op) {
    switch (op) {
        case '+':
            printf("a=%d b=%d\n", a, b);
            return a + b;
        case '-':
            return a - b;
        case '*':
            return a * b;
    }
    return 0;
}

int solve(char* s ) {
    // write code here
    int sum = 0, m, n, p, q;
    int num1 = 0, num2 = 0;
    int len;
    my_stack* haha = (my_stack*)malloc(sizeof(my_stack));
    my_stack_fuhao* fuhao = (my_stack_fuhao*)malloc(sizeof(my_stack_fuhao));
    len = strlen(s);

    init_my_stack(haha);
    init_my_stack_fuhao(fuhao);

    for (int i = 0; i < len; i++) {
        if (s[i] >= '0' && s[i] <= '9') {
            int num = 0;
            while (i < len && (s[i] >= '0' && s[i] <= '9')) {
                printf("s[%d] = %d\n", i, (s[i]-'0'));
                num = num * 10 + (s[i] - '0');
                i++;
            }
            i--;
            printf("i=%d num=%d\n", i, num);
            push(haha, num);
        } else if (s[i] == '(') {
            push_fuhao(fuhao, s[i]);
        } else if (s[i] == ')') {
            while (top_fuhao(fuhao) != '(') {
                int val2 = pop(haha);
                int val1 = pop(haha);
                char op = pop_fuhao(fuhao);
                int result = applyOperation(val1, val2, op);
                push(haha, result);
            }
            pop_fuhao(fuhao);
        } else {   //运算符号
            printf("%c %d %d, %d\n", s[i], top_fuhao(fuhao), youxianji_3(top_fuhao(fuhao)), youxianji_3(s[i]));
            while (youxianji_3(top_fuhao(fuhao)) >= youxianji_3(s[i])) {
                printf("%c", s[i]);
                int val2 = pop(haha);
                int val1 = pop(haha);
                char op = pop_fuhao(fuhao);
                int result = applyOperation(val1, val2, op);
                push(haha, result);
            }
            push_fuhao(fuhao, s[i]);
        }
    }

    while (!is_empty_fuhao(fuhao)) {
        printf("xiaobo here\n");
        int val2 = pop(haha);
        int val1 = pop(haha);
        char op = pop_fuhao(fuhao);
        int result = applyOperation(val1, val2, op);
        printf("val1=%d val2=%d op=%c, result=%d\n", val1, val2, op, result);
        printf("xiaobo 01 %d\n", haha->top);
        push(haha, result);
        printf("xiaobo 01 %d, result=%d, %d\n", haha->top, haha->arry[haha->top], haha->arry[1]);
    }
    return top(haha);
}

发表于 2024-09-30 20:00:50 回复(0)
中缀表达式,建立两个栈,分别是数字栈和符号栈,符号栈需要判断优先级,决定是否入栈,代码实现如下:
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 返回表达式的值
 * @param s string字符串 待计算的表达式
 * @return int整型
 */
#define MAXSIZE 100
//判断表达式的优先级
int symcmp(char a, char b) {
    if (b == '(')
        return 1;
    else if ((b == '*' || b == '/') && (a == '+' || a == '-' || a == '('))
        return 1;
    else if ((b == '+' || b == '-') && (a == '('))
        return 1;
    else
        return 0;
}
//计算运算值栈顶两个元素(a栈顶第一个元素,b栈顶第二个元素)
int calculate(char c, int a, int b) {
    int tmp = 0;
    switch (c) {
        case '+':
            tmp = b + a;
            break;
        case '-':
            tmp = b - a;
            break;
        case '*':
            tmp = b * a;
            break;
        case '/':
            tmp = b / a;
            break;
    }
    return tmp;
}

int solve(char* s ) {
    int num_stack[MAXSIZE]; //运算值栈
    int num_top = -1; //运算值栈指针
    char sym_stack[MAXSIZE]; //操作符栈
    int sym_top = -1; //操作符栈指针
    int i = 0;
    while (s[i] != '\0') {
        if (isdigit(s[i])) {
            //数字进入数字栈
            int val = 0;
            while (isdigit(s[i])) {
                val = val * 10 + s[i] - '0';
                i++;
            }
            num_stack[++num_top] = val;
        } else {
            //符号进去
            if (s[i] == ')') {
                while (sym_stack[sym_top] != '(') {
                    int ret = calculate(sym_stack[sym_top], num_stack[num_top],
                                        num_stack[num_top - 1]);
                    sym_top--;
                    num_top -= 2;
                    num_stack[++num_top] = ret;
                }
                sym_top--;
                i++;
            } else if (!symcmp(sym_stack[sym_top], s[i])) {
                while (sym_top > -1 && (!symcmp(sym_stack[sym_top], s[i]))) {
                    int ret = calculate(sym_stack[sym_top], num_stack[num_top],
                                        num_stack[num_top - 1]); //计算栈顶两个元素
                    sym_top--;
                    num_top -= 2;
                    num_stack[++num_top] = ret;
                }
                sym_stack[++sym_top] = s[i];
                i++;
            }
            else {
                sym_stack[++sym_top] = s[i];
                i++;
            }
        }
    }
    while (sym_top > -1) {
        int ret = calculate(sym_stack[sym_top], num_stack[num_top], num_stack[num_top - 1]); //计算栈顶两个元素
		sym_top--;
		num_top -= 2;
		num_stack[++num_top] = ret;
    }
    return num_stack[0];
}


发表于 2024-08-21 22:57:21 回复(0)
帮忙看看,为何结果错误

#include<bits/stdc++.h>
using namespace std;
typedef int Status;
typedef char SElemType;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct
{
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;
//初始化 
Status InitStack(SqStack &S)
{
    S.base=new SElemType[MAXSIZE];
    if(!S.base) exit(OVERFLOW);
    S.top=S.base;
    S.stacksize=MAXSIZE;
    return OK;
}
//入栈 
Status Push(SqStack &S,SElemType e)
{
    if(S.top-S.base==S.stacksize)
        return ERROR;
    *S.top++=e;
    return OK;
}
//出栈 
Status Pop(SqStack &S,SElemType &e)
{
    if(S.top==S.base)
        return ERROR;
    e=*--S.top;
    return OK;
}
//返回栈顶元素,不修改栈顶指针 
SElemType GetTop(SqStack S)
{
    if(S.top!=S.base)
    return *(S.top-1);

//判断是否是运算符
Status In(SElemType e)
{
    if(e=='+'||e=='-'||e=='*'||e=='/'||e=='('||e==')'||e=='#')
        return OK;
    else return ERROR;

//判断运算符的优先级 
SElemType Precede(char a,char b)
{
    char f;
    if(a=='+'||a=='-')
    {
        if(b=='+'||b=='-'||b==')'||b=='#')
            f='>';
        else if(b=='*'||b=='/'||b=='(')
            f='<';
    }
    else if(a=='*'||a=='/')
    {
        if(b=='+'||b=='-'||b=='*'||b=='/'||b==')'||b=='#')
            f='>';
        else if(b=='(')
            f='<';
    }
    else if(a=='(')
    {
        if(b=='+'||b=='-'||b=='*'||b=='/'||b=='(')
            f='<';
        else if(b==')')
            f='=';
    }
    else if(a==')')
    {
        if(b=='+'||b=='-'||b=='*'||b=='/'||b==')'||b=='#')
            f='>';
    }
    else if(a=='#')
    {
        if(b=='+'||b=='-'||b=='*'||b=='/'||b=='(')
            f='<';
        else if(b=='#')
            f='=';
    }
    return f;
}
//计算结果 
Status Operate(int i,char theta,int j)
{
    int result;
    switch(theta)
    {
        case '+':
            result=i+j;
            break;
        case '-':
            result=i-j;
            break;
        case '*':
            result=i*j;
            break;
        case '/':
            result=i/j;
            break;
    }
    return result;
}
SElemType EvaluateExpression()
{
    SqStack OPTR,OPND;
    char ch;
    char a,b,theta,x;
    InitStack(OPTR);
    Push(OPTR,'#');
    InitStack(OPND);
    ch=getchar();
    while(ch!='#'||GetTop(OPTR)!='#')
    {
        cin>>ch;
        if(!In(ch))
        {
            Push(OPND,ch);
            ch=getchar();
        }
        else{
            switch(Precede(GetTop(OPTR),ch)){
                case '<':
                    Push(OPTR,ch);
                    ch=getchar();
                    break;
                case '>':
                    Pop(OPTR,theta);
                    Pop(OPND,b);
                    Pop(OPND,a);
                    Push(OPND,Operate(a,theta,b));
                    break;
                case '=':
                    Pop(OPTR,x);
                    ch=getchar();
                    break;
            }
        }
    }
    return GetTop(OPND);
}
int main()
{
        cout<<"输入表达式(以#结束):"<<endl;
        EvaluateExpression();
        cout<<Operate<<endl;
        return 0;
}

发表于 2024-06-22 17:53:33 回复(0)
int GetInt(char **s) {
    int res=0;
    bool GetInt = false;
    while((**s)!=0) {
        if((**s)>='0' && (**s)<='9') {
            res *=10;
            res += ((**s)-'0');
            (*s)++;
            GetInt = true;
        }
        else {
            if(GetInt) 
               break;
            else 
               (*s)++;
                
        }
    }
    return res;
}

int bracketLen(char *s) {
    int len=0;
    if(s[0]!='(')
        return 0;
    else {
        s++;
        while(1) {
            char c = s[len];
            if(c=='(') {
                len += bracketLen(s+len)+2;
                continue;
            }
            else if(c==')' || c==0) 
                break;
            len++;
        }
        
    }
    return len;
}

int solve(char* s ) {
    #define push(a) stack[pointStack++] = a
    #define pop()   stack[--pointStack]

    int stack[100]={0}, pointStack=0;
    int res=0;
    char *p=s;
    bool firstFlag = true;
    while(*p) {
        if(*p=='(') {
            char *buffer;
            int BKval;
            int BKLen = bracketLen(p);
            buffer = (char*)malloc(BKLen+1);
            strncpy(buffer, p+1, BKLen);
            buffer[BKLen] = 0;
            BKval = solve(buffer);
            if(!firstFlag) {
                if(*(p-1)=='-')
                    push(-BKval);
                else if(*(p-1)=='+')
                    push(BKval);
                else if(*(p-1)=='*') 
                    push(pop()*BKval);  
            }
            else
                push(BKval);
            firstFlag = false;
            p += BKLen+strlen("()");
        }
        else if(*p>='0' && *p<='9') {
            if(!firstFlag) {
                if(*(p-1)=='-')
                    push(-GetInt(&p));
                else if(*(p-1)=='+')
                    push(GetInt(&p));
                else if(*(p-1)=='*')
                    push(pop()*GetInt(&p));    
            }
            else
                push(GetInt(&p));
            firstFlag = false;
        }
        else if(*p=='+' || *p=='-') {
            while(pointStack) 
                res += pop();
            p++;
        }
        else if(*p=='*' || *p==')') 
            p++;
    }
    while(pointStack) {
        res += pop();
    }
    return res;
}

编辑于 2024-03-20 17:20:41 回复(0)
用了递归。
#include <string.h>

//返回字符串长度
int sizestr(char* s) {
    int i = 0;
    while (s[i] != '\0')
        i++;
    return i + 1;
}

int solve(char* s) {
    // write code here
    int data[100], sign[100];
    int no = 0, no_s = 0;
    for (int i = 0;s[i] != '\0';i++) {
        if (s[i] == '(')
            data[no++] = solve(s + i + 1);//遇到'('时递归
        if (s[i] == ')') {
            memcpy(s, s + i + 1, sizestr(s + i + 1));//函数退出时,清理已经计算过的表达式,防止重复计算
            break;
        }

        if (s[i] >= '0' && s[i] <= '9') {
            int num = 0;
            while (s[i] >= '0' && s[i] <= '9') {//字符数转int,存入数组
                num = num * 10 + s[i] - '0';
                i++;
            }
            i--;
            data[no++] = num;
        }

        if (s[i] == '*') {//乘法可以先计算,先算后存
            i++;
            if (s[i] >= '0' && s[i] <= '9') {
                int num = 0;
                while (s[i] >= '0' && s[i] <= '9') {
                    num = num * 10 + s[i] - '0';
                    i++;
                }
                i--;
                data[no - 1] *= num;//计算结果覆盖存入
            }
            else if (s[i] == '(')//出现'*('时的情况
                data[no - 1] *= solve(s + i + 1);//同样先计算括号里的
        }
        else if (s[i] == '+') {//加减法,先存再算,此时只要存符号,数字上面存了
            sign[no_s++] = s[i];
        }
        else if (s[i] == '-') {
            sign[no_s++] = s[i];
        }
    }
    for (int i = 0, j = 0;i < no_s;i++) {//计算
        if (sign[i] == '+') {
            data[j + 1] = data[j] + data[j + 1];
            data[j++] = 0;
        }
        else if (sign[i] == '-') {
            data[j + 1] = data[j] - data[j + 1];
            data[j++] = 0;
        }
    }
    return data[no - 1];
}


发表于 2023-07-12 19:24:03 回复(0)
/*
支持加减乘括号运算,"2*(3+4)"
1.建立两个栈,一个存数字,一个存运算符;
2.对于数字直接进栈,对于运算符,当前运算符大于栈顶运算符时入栈,否则从数栈中弹出两个数进行运算。
3.注意:字符串遍历完,同时运算符栈为空时,计算才结束;对于数字要循环读取字符直至运算符;
*/
int isOperator(char c){
	if(c=='(' || c==')' || c=='+' || c=='-' || c=='*')
		return 1;
	else
		return 0;
}
/*
运算符优先级比较一定考虑哪个在左边哪个在右边,
a ? b (a在左边,b在右边,即a是已经进栈字符,b是当前字符)
a,b ( ) + - *
(   < = < < < 
)   ? > > > >
+   < > > > <
-   < > > > <
*   < > > > >
*/
char getCmp(char a,char b){//a在左边,b在右边
	if(a=='('){
		if(b==')')
			return '=';
		return '<';
	}else if(a==')'){
		return '>';
	}else if(a=='+' || a=='-'){
		if(b=='(' || b=='*')
			return '<';
		return '>';
	}else{//a=='*'
		if(b=='(')
			return '<';
		return '>';
	}
}
int cal(int a,int b,char op){
	if(op=='+')
		return a+b;
	else if(op=='-')
		return a-b;
	else
		return a*b;
}
int solve(char* s ) {
	int stk_num[100];
	char stk_op[100],op;
	int top_num=0,top_op=0,i=0,a,b;
	while(s[i]!='\0'|| top_op!=0){
		if(s[i]!='\0' && isOperator(s[i])==1){//是运算符
			if(top_op==0 || getCmp(stk_op[top_op-1],s[i])=='<'){//当前运算符优先级较大,压栈
				stk_op[top_op++]=s[i];
				i++;
			}else if(getCmp(stk_op[top_op-1],s[i])=='>'){//弹栈,进行运算
				op=stk_op[--top_op];
				b=stk_num[--top_num];
				a=stk_num[--top_num];
				stk_num[top_num++]=cal(a,b,op);//计算后再压栈
			}else{//消掉左右括号
				top_op--;
				i++;
			}
		}else if(s[i]=='\0'){//字符全部压入栈,弹栈
			while(top_op!=0){//内循环弹运算符栈,不用走大循环
				b=stk_num[--top_num];
				a=stk_num[--top_num];
				op=stk_op[--top_op];
				stk_num[top_num++]=cal(a,b,op);//计算后再压栈	
			}		
		}else{//是操作数
			int x=0;
			while(s[i]!='\0' && isOperator(s[i])!=1){//循环读取n位数,构成一个操作数
				x=x*10+s[i]-'0';
				i++;
			}
			stk_num[top_num++]=x;
		}
	}//while
	return stk_num[0];
}

发表于 2023-04-02 12:02:56 回复(0)
拿C写这东西
char* noBlank(char *s){
    char *p = (char *)malloc(sizeof(char) * (strlen(s)+1));
    strcpy(p, s);
    int len = strlen(s);
    
    for(int i=0; i<len; i++){
        if(*(p+i) == ' '){
            for(int j=i; j<len; j++){
                *(p+j) = *(p+j+1);
            }
            len--;
            i--;
        }
    }
    return p;
}

int solve(char* s ) {
    // write code here
    char *p;
    char *q;
    int t;
    int len = strlen(s);
    int quelen = 10;
    
    p = noBlank(s);
    
    int stackInt[quelen];
    memset(stackInt, 0, sizeof(stackInt));
    char stackChar[quelen];
    memset(stackChar, 0, sizeof(stackChar));
    int lock = 0;
    int up = 0, top = 0;
    
    while(*p != '\0'){
        if(48 <= *p && *p <= 57){    //如果是数字
            stackInt[up] = stackInt[up]*10 + (*p - 48);
            lock = 1;
        }
        else{
            if(stackChar[top-1] != 0){
                if(*p == ')'){
                    t = top;
                    while(stackChar[t-1] != '('){
                        switch (stackChar[t-1]){
                            case '+':
                                stackInt[up-2] = stackInt[up-2] + stackInt[up-1];
                                stackInt[--up] = 0;
                                break;
                            case '-':
                                stackInt[up-2] = stackInt[up-2] - stackInt[up-1];
                                stackInt[--up] = 0;
                                break;
                            case '*':
                                stackInt[up-2] = stackInt[up-2] * stackInt[up-1];
                                stackInt[--up] = 0;
                                break;
                            case '(':
                                break;
                        }
                        t--;
                        top--;
                    }
                    top--;
                }
                else if(*p == '('){
                    stackChar[top++] = *p;
                }
                else{
                    switch (*p){
                        case '*':
                            switch (stackChar[top-1]){
                                case '(':
                                    stackChar[top++] = *p;
                                    break;
                                case '*':
                                    stackInt[up-2] = stackInt[up-2] * stackInt[up-1];
                                    stackInt[--up] = 0;
                                    stackChar[top-1] = *p;
                                    break;
                                case '+':
                                    stackChar[top++] = *p;
                                    break;
                                case '-':
                                    stackChar[top++] = *p;
                                    break;
                            }
                            break;
                        case '+':
                            switch (stackChar[top-1]){
                                case '(':
                                    stackChar[top++] = *p;
                                    break;
                                case '*':
                                    stackInt[up-2] = stackInt[up-2] * stackInt[up-1];
                                    stackInt[--up] = 0;
                                    stackChar[top-1] = *p;
                                    break;
                                case '+':
                                    stackInt[up-2] = stackInt[up-2] + stackInt[up-1];
                                    stackInt[--up] = 0;
                                    stackChar[top-1] = *p;
                                    break;
                                case '-':
                                    stackInt[up-2] = stackInt[up-2] - stackInt[up-1];
                                    stackInt[--up] = 0;
                                    stackChar[top-1] = *p;
                                    break;
                            }
                            break;
                        case '-':
                            switch (stackChar[top-1]){
                                case '(':
                                    stackChar[top++] = *p;
                                    break;
                                case '*':
                                    stackInt[up-2] = stackInt[up-2] * stackInt[up-1];
                                    stackInt[--up] = 0;
                                    stackChar[top-1] = *p;
                                    break;
                                case '+':
                                    stackInt[up-2] = stackInt[up-2] + stackInt[up-1];
                                    stackInt[--up] = 0;
                                    stackChar[top-1] = *p;
                                    break;
                                case '-':
                                    stackInt[up-2] = stackInt[up-2] - stackInt[up-1];
                                    stackInt[--up] = 0;
                                    stackChar[top-1] = *p;
                                    break;
                            }
                            break;
                    }}
            }
            else
                stackChar[top++] = *p;
        }
        if(!(48 <= *(p+1) &&  *(p+1) <= 57) && lock == 1){
            up++;
            lock = 0;
        }
            
        p++;
    }
    while(top != 0){
        switch (stackChar[top-1]){
            case '+':
                stackInt[up-2] = stackInt[up-2] + stackInt[up-1];
                stackInt[--up] = 0;
                break;
            case '-':
                stackInt[up-2] = stackInt[up-2] - stackInt[up-1];
                stackInt[--up] = 0;
                break;
            case '*':
                stackInt[up-2] = stackInt[up-2] * stackInt[up-1];
                stackInt[--up] = 0;
                stackChar[top-1] = *p;
                break;
        }
        top--;
    }
    
    return stackInt[0];
}


发表于 2022-07-29 18:51:38 回复(1)