题目1101:计算表达式
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:1618
解决:433
-
题目描述:
-
对于一个不存在括号的表达式进行计算
-
输入:
-
存在多种数据,每组数据一行,表达式不存在空格
-
输出:
-
输出结果
-
样例输入:
-
6/2+3+3*4
-
样例输出:
-
18
-
来源:
- 2010年上海交通大学计算机研究生机试真题
-
#include<stdio.h>//这个算法的表达式可以是包含括号的 #include<iostream> #include<malloc.h> #include<string.h> #include<stdlib.h> const char *op = "+-*/()#"; //函数结果代码和相关定义 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW 0 #define NULL 0 //栈的顺序表示 typedef int SELEMTYPE; typedef int STATUS; #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct{ SELEMTYPE *base; SELEMTYPE *top; int stacksize; }sqstack; STATUS initStack(sqstack& s) { s.base = (SELEMTYPE* )malloc(STACK_INIT_SIZE * sizeof(SELEMTYPE)); if(s.base == NULL) exit(OVERFLOW); s.top = s.base; s.stacksize = STACK_INIT_SIZE; return OK; } STATUS push(sqstack& s, SELEMTYPE el) { if(s.top - s.base == s.stacksize) { s.base = (SELEMTYPE* )realloc(s.base, (STACK_INIT_SIZE + STACKINCREMENT) * sizeof(SELEMTYPE)); s.top = s.base + s.stacksize; s.stacksize = STACK_INIT_SIZE + STACKINCREMENT; } *(s.top++) = el; return OK; } SELEMTYPE pop(sqstack& s, SELEMTYPE& el) { if(s.base == s.top) return ERROR; return el = *(--s.top); } SELEMTYPE getTop(sqstack& s) { if(s.base == s.top) exit(OVERFLOW); return *(s.top - 1); } //核心函数 int in(int c) { for(int i = 0; i < strlen(op); i++) if(op[i] == c) return OK; return FALSE; } int precede(int a,int b) { switch(a){ case'+': if(b=='*'||b=='/'||b=='(') return '<'; else return '>'; case'-': if (b=='*'||b=='/'||b=='(') return '<'; else return '>'; case'*': if (b=='(') return '<'; else return '>'; case'/': if (b=='(') return '<'; else return '>'; case'(': if (b==')') return '='; else return '<'; case')': return '>'; case'#': if (b=='#') return '='; else return '<'; } exit(ERROR); } SELEMTYPE operate(SELEMTYPE a,SELEMTYPE t,SELEMTYPE b) { switch(t){ case'+': return a + b; case'-': return a - b; case'*': return a * b; case'/': return a / b; } exit(ERROR); } SELEMTYPE EvaluateExpression(char* s){ sqstack OPTR, OPND; initStack(OPTR);initStack(OPND); push(OPTR, '#'); SELEMTYPE theta, a, b, x, temp; int i = 0;x = s[i] - '0'; while(s[i] != '#' || getTop(OPTR) != '#'){ if(!in(s[i])){ while(!in(s[++i]) && isdigit(s[i])){ x = x * 10 + s[i] - '0'; } push(OPND, x); if(s[i] == '\n') s[i] = '#'; }//碰到数字 else switch(precede(getTop(OPTR), s[i])){//运算符 case'>'://OPTR栈顶优先级大于新进的 pop(OPTR, theta); pop(OPND, b);pop(OPND, a); push(OPND, operate(a, theta, b)); break; case'='://左括号碰到右括号 temp = s[i]; pop(OPTR, temp);i++; x = s[i] - '0'; break; case'<':// temp = s[i]; push(OPTR, temp);i++; x = s[i] - '0'; break; }//switch }//while return getTop(OPND); } int main(void) { char st[1000]; while(scanf("%s", st) == 1){ st[strlen(st)] = '\n'; printf("%d\n", EvaluateExpression(st)); } return 0; } /************************************************************** Problem: 1101 User: true14fans Language: C++ Result: Accepted Time:0 ms Memory:1520 kb ****************************************************************/