资源描述:
《实验2 栈和队列的应用-算术表达式求值.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、1.实验题目栈和队列的应用2.实验内容算术表达式求值3.实验目的掌握栈和队列的概念及工作原理,运用其原理完成实验题目中的内容。4.实验要求为了更好的掌握与理解课堂上老师所讲的概念与原理,实验前要认真预习所做的实验内容及编写源程序伪码(写在纸上及盘中均可)以便在实验课中完成老师所布置的实验内容。5.概要设计原理6.详细程序清单及注释说明#include#include#include#include#defineNULL0#defineOK
2、1#defineOVERFLOW-2#defineSTACK_INIT_SIZE100#defineSTACKINCREMENT20/*定义字符类型栈*/typedefstruct{intstacksize;char*base;char*top;}SqStack;/*-----------------全局变量---------------*/SqStackOPTR,OPND;//定义运算符栈和操作数栈charexpr[255];/*存放表达式串*/char*ptr=expr;intInitStack(SqStack*s
3、)//构造运算符栈{s->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));if(!s->base)exit(OVERFLOW);s->top=s->base;s->stacksize=STACK_INIT_SIZE;returnOK;}charIn(charch)//判断字符是否是运算符,运算符即返回1{return(ch=='+'
4、
5、ch=='-'
6、
7、ch=='*'
8、
9、ch=='/'
10、
11、ch=='('
12、
13、ch==')'
14、
15、ch=='#');}intPush(SqSta
16、ck*s,charch)//运算符栈插入ch为新的栈顶元素{*s->top=ch;s->top++;return0;}charPop(SqStack*s)//删除运算符栈s的栈顶元素,用p返回其值{charp;s->top--;p=*s->top;returnp;}charGetTop(SqStacks)//用p返回运算符栈s的栈顶元素{charp=*(s.top-1);returnp;}/*判断运算符优先权,返回优先权高的*/charPrecede(charc1,charc2){inti=0,j=0;staticch
17、ararray[49]={'>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<','<','<','<','=','!','>','>','>','>','!','>','>','<','<','<','<','<','!','='};switch(c1){/*i为下面array的横标*/case'+':i=0;break;case'-'
18、:i=1;break;case'*':i=2;break;case'/':i=3;break;case'(':i=4;break;case')':i=5;break;case'#':i=6;break;}switch(c2){/*j为下面array的纵标*/case'+':j=0;break;case'-':j=1;break;case'*':j=2;break;case'/':j=3;break;case'(':j=4;break;case')':j=5;break;case'#':j=6;break;}return
19、(array[7*i+j]);/*返回运算符*/}/*操作函数*/intOperate(inta,charop,intb){switch(op){case'+':return(a+b);case'-':return(a-b);case'*':return(a*b);case'/':return(a/b);}return0;}intnum(intn)//返回操作数的长度{charp[10];itoa(n,p,10);//把整型转换成字符串型n=strlen(p);returnn;}intEvaluateExpressio
20、n()//主要操作函数{charc,theta,x;intn,m;inta,b;c=*ptr++;while(c!='#'
21、
22、GetTop(OPTR)!='#'){if(!In(c)){if(!In(*(ptr-1)))ptr=ptr-1;m=atoi(ptr);//取字符串前面的数字段n=num(m);Push(&OPND,m)