資料結構 棧的應用——算術表示式求值
阿新 • • 發佈:2019-01-10
實驗目的 :
1 .掌握棧的定義及實現;
2 .掌握利用棧求解算術表示式的方法。
實驗內容:
通過修改完善教材中的演算法3.4,利用棧來實現算術表示式求值的演算法。對演算法3.4中呼叫的幾個函式要給出其實現過程:
(1) 函式In(c):判斷c是否為運算子;
(2) 函式Precede(t1,t2):判斷運算子t1和t2的優先順序;
(3) 函式Operate(a,theta,b):對a和b進行二元運算theta。
程式執行時,輸入合法的算術表示式(中間值及最終結果要在0~9之間,可以包括加減乘除和括號),便可輸出相應的計算結果。如下圖:
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 100 typedef int Status; typedef char SElemType; typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; Status InitStack(SqStack &S)//初始化 { S.base=(SElemType*)malloc(sizeof(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;//元素e壓入棧頂,棧頂指標加1; return OK; } Status Pop(SqStack &S,SElemType &e)//出棧 { if(S.top==S.base)//棧空 return ERROR; e=*--S.top;//棧頂指標減一,將棧頂元素賦給e; return OK; } SElemType GetTop(SqStack S)//取棧頂元素 { if(S.top!=S.base)//棧非空 return *(S.top-1);//返回棧頂元素的值,棧頂指標不變 } int In(SElemType e)//判斷讀入字元是否為運算子 { if(e=='+'||e=='-'||e=='*'||e=='/'||e=='('||e==')'||e=='#') return 1;//是 else return 0; //不是 } SElemType Precede(SElemType a,SElemType b)//比較運算子的優先順序 { SElemType 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; } SElemType Operate(SElemType a,SElemType theta,SElemType b)//運算 { SElemType c; a=a-'0'; b=b-'0'; if(theta=='+') c=a+b+'0'; else if(theta=='-') c=a-b+'0'; else if(theta=='*') c=a*b+'0'; else if(theta=='/') c=a/b+'0'; return c; } int EvaluateExpression() { SqStack OPND,OPTR; char ch,a,b,theta,x; InitStack(OPND);//寄存運算元和運算結果 InitStack(OPTR);//寄存運算子 Push(OPTR,'#'); ch=getchar(); while(ch!='#'||GetTop(OPTR)!='#') { 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)-'0'; } int main() { printf("請輸入算術表示式,並以#結束\n"); printf("結果是: %d\n",EvaluateExpression()); return 0; }