#include <stdio.h> #include <stdlib.h> #include <string.h> #define STACK_INIT_SIZE 100 // 存储空间初始分配量 #define STACKINCREMENT 10 // 存储空间分配增量 typedef int Status; #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW 0 // 栈分配溢出 #define OPSETSIZE 7 // 表3.1 算符间的优先关系 unsigned char Prior[7][7] = { { '>', '>', '<', '<', '<', '>', '>' }, { '>', '>', '<', '<', '<', '>', '>' }, { '>', '>', '>', '>', '<', '>', '>' }, { '>', '>', '>', '>', '<', '>', '>' }, { '<', '<', '<', '<', '<', '=', ' ' }, { '>', '>', '>', '>', ' ', '>', '>' }, { '<', '<', '<', '<', '<', ' ', '=' } }; char OPSET[OPSETSIZE]= { '+', '-', '*', '/', '(', ')', '#' }; typedef int SElemType; typedef struct { SElemType * base; // 在栈构造之前和销毁之后,base的值为NULL SElemType * top; // 栈顶指针 int stacksize; // 当前已分配的存储空间,以元素为单位 } SqStack; Status InitStack(SqStack &S) { // 构造一个空栈 S.base = (SElemType *) malloc(STACK_INIT_SIZE * sizeof(SElemType)); if (!S.base) exit(OVERFLOW); // 存储分配失败 S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; }// InitStack SElemType GetTop(SqStack S) { return *(S.top - 1); }// GetTop Status Push(SqStack &S, SElemType e) { // 插入元素 e 为新的栈顶元素 if (S.top - S.base >= S.stacksize) { //栈满,追加存储空间 S.base = (SElemType *) realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType)); if (!S.base) exit(OVERFLOW); // 存储分配失败 S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++ = e; return OK; } // Push Status Pop(SqStack &S, SElemType &e) { // 若栈不为空,则删除 S 的栈顶元素,用 e 返回其值,并返回 OK;否则返回 ERROR if (S.top == S.base) return ERROR; e = *--S.top; return OK; } // Pop Status StackEmpty(SqStack S) { // 若栈 S 为空栈,则返回 TRUE,否则返回 FALSE return S.top == S.base; } // StackEmpty void ClearStack(SqStack &S) { // 将栈 S 清空 S.top = S.base; } // ClearStack void DestroyStack(SqStack &S) { // 销毁整个栈 while (S.top != S.base) { // 释放栈中元素的空间 free(--S.top); } S.top = S.base = NULL; } // DestroyStack int Operate(int a, unsigned char theta, int b) { switch (theta) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; default: return 0; } } Status In(char Test, char* TestOp) { int Find = 0; int i; for (i = 0; i < OPSETSIZE; i++) { if (Test == TestOp[i]) Find = 1; } return Find; } int ReturnOpOrd(char op, char* TestOp) { int i; for (i = 0; i < OPSETSIZE; i++) { if (op == TestOp[i]) return i; } return 0; } char precede(char Aop, char Bop) { return Prior[ReturnOpOrd(Aop, OPSET)][ReturnOpOrd(Bop, OPSET)]; } int EvaluateExpression(char* MyExpression) { // 算法3.4 // 算术表达式求值的算符优先算法。 // 设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合。 SqStack OPTR; // 运算符栈,字符元素 SqStack OPND; // 运算数栈,实数元素 char TempData[20]; int Data, a, b; char *c, Dr[2]; int x, theta; InitStack(OPTR); Push(OPTR, '#'); InitStack(OPND); c = MyExpression; strcpy(TempData, "\0"); while (*c != '#' || GetTop(OPTR) != '#') { if (!In(*c, OPSET)) { // 不是运算符则进栈 Dr[0] = *c; Dr[1] = '\0'; strcat(TempData, Dr); c++; if (In(*c, OPSET)) { Data = atoi(TempData); Push(OPND, Data); strcpy(TempData, "\0"); } } else { switch (precede(GetTop(OPTR), *c)) { case '<': // 栈顶元素优先权低 Push(OPTR, *c); c++; break; case '=': // 脱括号并接收下一字符 Pop(OPTR, x); c++; break; case '>': // 退栈并将运算结果入栈 Pop(OPTR, theta); Pop(OPND, b); Pop(OPND, a); Push(OPND, Operate(a, theta, b)); break; } // switch } } // while return GetTop(OPND); } // EvaluateExpression int main(){ char MyExpression[100]; // 获得表达式字符串 while(gets(MyExpression) && strlen(MyExpression)){ printf("%d\n", EvaluateExpression(MyExpression)); } return 0; } /************************************************************** Problem: 2145 User: admin Language: C++ Result: Accepted Time:11 ms Memory:1040 kb ****************************************************************/