数据结构实验二Word格式.doc
《数据结构实验二Word格式.doc》由会员分享,可在线阅读,更多相关《数据结构实验二Word格式.doc(8页珍藏版)》请在冰豆网上搜索。
二、实验要求
1.进行栈的基本操作时要注意栈"
后进先出"
的特性。
2.编写完整程序完成下面的实验内容并上机运行。
3.整理并上交实验报告。
三、实验内容
1.编写生成栈的函数,栈的元素从键盘输入
2.编写在栈中压入一个元素的函数
3.编写在栈中弹出一个元素的函数
4.编写主函数,调用以上各函数,以便能观察出各函数的屏幕输出。
四、实验步骤以及程序测试
#include<
iostream>
string>
#defineL1100
#defineL210
typedefintElemType;
usingnamespacestd;
//1.编写程序任意输入栈长度和栈中的元素值
typedefstruct
{
ElemType*base;
ElemType*top;
intstacksize;
}SqStack;
intInitStack(SqStack&
S)//构造一个顺序栈
S.base=(ElemType*)malloc(L1*sizeof(ElemType));
if(!
S.base)
return0;
S.top=S.base;
S.stacksize=L1;
return1;
}
intClearStack(SqStack&
S)//清空、
if(S.top!
=S.base)
{
S.stacksize=0;
intDestroyStack(SqStack&
S)//销毁、
free(S.base);
if(S.base)
intPush(SqStack&
S,ElemTypee)//入栈
if(S.top-S.base>
=S.stacksize)
S.base=(ElemType*)realloc(S.base,(S.stacksize+L2)*sizeof(ElemType));
return0;
S.top=S.base+S.stacksize;
S.stacksize+=L2;
*S.top++=e;
intPop(SqStack&
S,ElemType&
e)//出栈
if(S.top==S.base)
e=*(--S.top);
ElemTypeGetTop(SqStackS)//取栈顶元素操作
returnNULL;
return*(S.top-1);
};
intPrecede(chartop,chare)//用来比较运算符优先级的函数
switch(top)
case'
+'
:
-'
if(e=='
||e=='
)'
#'
){return1;
}//栈顶元素优先,返回1
else{return-1;
}//栈顶元素没有优先权,返回-1以下相同
*'
/'
('
){return-1;
else{return1;
}
){return0;
}//返回0表示搭配括号
else{return-1;
if(e=='
}elsereturn-1;
ElemTypeOperate(ElemTypea,ElemTypetheta,ElemTypeb)//计算加减乘除
switch(theta)
case43:
returna+b;
case45:
returna-b;
case42:
returna*b;
case47:
returna/b;
doubleEvalExpression(stringex)
ElemTypea,b,theta;
SqStackOPTR,OPND;
InitStack(OPTR);
//设运算符栈OPTR
InitStack(OPND);
//运算数栈OPND
Push(OPTR,'
);
//栈底
charch=ex[0];
for(inti=0;
ch!
='
||GetTop(OPTR)!
;
i++)
ElemTypeoprand=0;
intj=10;
while(ex[i]>
=48&
&
ex[i]<
=57)//判断是否是数字
{
oprand=oprand*j+ex[i++]-48;
}
if(oprand!
=0)
Push(OPND,oprand);
ch=ex[i];
if(ch>
=40&
ch<
=43||ch=='
||ch=='
)
{
switch(Precede(GetTop(OPTR),ch))
case-1:
//栈顶元素优先权--底--
Push(OPTR,ch);
break;
case0:
//栈顶元素和ex[i]为配对括号,脱掉
Pop(OPTR,a);
case1:
//栈顶元素优先
Pop(OPTR,theta);
Pop(OPND,b);
Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
i--;
break;
}//switch
else
returnGetTop(OPND);
intmain()
intn;
stringstr;
cin>
>
n;
while(n--)
str;
doubleresult=EvalExpression(str+'
cout<
<
str<
"
="
result<
endl;
五、总结
1、程序中关于字符与数值之间的转换,是耗费我大量时间考虑的部分,我试图
寻找一种更高效的方法来实现,然而我仍在学习中。
2、这次实验用栈来求表达式值,让我更加熟悉了栈的特点及操作。
六、思考与提高
如果一个程序中要用到两个栈,为了不发生上溢错误,就必须给每个栈预先分配一个足够大的存储空间。
若每个栈都预分配过大的存储空间,势必会造成系统空间紧张。
如何解决这个问题?
答:
就像以上程序中预定义的L1,L2,事先给栈设置一个存储空间分配增量,当栈满的时候,使用realloc函数扩大栈的空间。