数据结构课程设计表达式求值问题Word文件下载.docx
- 文档编号:17356225
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:29
- 大小:55.54KB
数据结构课程设计表达式求值问题Word文件下载.docx
《数据结构课程设计表达式求值问题Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计表达式求值问题Word文件下载.docx(29页珍藏版)》请在冰豆网上搜索。
voidClearStack();
//清空栈
voidStackTop();
//返回栈顶指针
voidStackTranverse();
//显示栈中元素
};
(2)顺序栈类实现:
对顺序栈进行初始化,初始化的首要操作就是创建一个空顺序栈。
Step1:
申请一组连续的内存空间为顺序栈使用:
base=newT[m];
if(base==NULL)
{
cout<
<
"
栈创建失败,退出!
endl;
exit
(1);
}
Step2:
给栈顶、栈容量赋相应的值:
stacksize=m;
top=-1;
(2)顺序栈入栈:
入栈需要在栈顶插入一个新元素并相应的调整栈顶。
首先判断是否栈满,如果栈满,抛出“上溢”信息,无法入栈,否则转入Step2;
if(top==stacksize-1)throw"
栈满,无法入栈"
;
栈顶指针增加1;
top++;
Step3:
新元素插入栈顶位置;
base[top]=x;
(3)顺序栈出栈:
出栈需要取出栈顶元素,并相应的调整栈顶指针。
首先判断是否栈空,如果栈空,抛出“下溢”信息,无法出栈,否则转入Step2;
if(top==-1)throw"
栈空,不能出栈"
取出栈顶元素,栈顶指针减1;
Tx;
x=base[top--];
返回栈顶元素;
returnx;
(4)顺序栈取栈顶元素:
取栈顶元素是取出栈顶元素的值,但不改变栈。
if(top==-1)throw"
栈空,栈顶无元素"
取出栈顶元素,返回栈顶元素;
returnbase[top];
(5)判断栈空:
判断是否栈空,返回
如果栈空,返回1,否则转Step2;
if(top==-1)
return1;
否则返回0;
return0;
(6)清空栈:
将栈清空。
top=-1
(7)返回栈顶指针:
cout<
栈顶top="
top;
(8)输出栈元素:
将栈顶指向i,从栈顶输出到栈底。
将栈顶指针赋予i;
inti=top;
如果栈不为空,则输出;
while(i>
=0)
cout<
base[i--]<
'
\t'
3.算法设计
本实验要求读入中缀表达式,求中缀表达式,将中缀表达式转换成前,后缀表达式,利用前,中,后缀表达式求值,并且能够输出等等操作,这就需要构建相关算法。
(1)首先要将表达式中操作符优先级进行排序,优先级从高到低依次为(,),*,/,+,-,算法如下,利用选择语句比较:
charPrecede(chart1,chart2)
{//运算符的优先级比较
charf;
switch(t2)
case'
+'
:
-'
if(t1=='
('
||t1=='
='
)
f='
else
>
break;
*'
/'
)'
ERROR1"
exit(0);
switch(t1)
f='
ERROR2"
default:
returnf;
(2)其次,就是判断输入元素是否为运算符,若为运算符,就输出1,否则输出0;
intIn(charc)
{//判断c是否为运算符
switch(c)
case'
return1;
(3)构造表达式的运算算法,利用选择语句将运算分类:
floatOperate(floata,chartheta,floatb)
{//实施一次运算
floatc;
switch(theta)
c=a+b;
c=a-b;
c=a*b;
c=a/b;
returnc;
(4)要求一:
中缀表达式求值
首先需要将运算符和运算数分开存放,这就需要分别创建栈:
SqStack<
char>
OP(20);
float>
OD(20);
Step2:
创建相关字符来存放由键盘输入的字符,并以“=”键结束
chartheta;
floata,b,d;
charc,x;
//存放由键盘接收的字符
charz[6];
//存放符点数字符串
inti;
OP.Push('
);
当输入为数字元素是,直接存入表达式栈就可以,而当输入是符号元素时,就需要判断优先级并进行存栈出栈操作,如果是非法字符,输出错误,并且不存入;
c=*exp++;
x=OP.GetTop();
while(c!
||x!
if(In(c))//是7种运算符之一
switch(Precede(x,c))
OP.Push(c);
//栈顶元素优先权低
c=*exp++;
x=OP.Pop();
//脱括号并接收下一字符
theta=OP.Pop();
//退栈并将运算结果入栈
b=OD.Pop();
a=OD.Pop();
OD.Push(Operate(a,theta,b));
elseif(c>
0'
&
c<
9'
||c=='
.'
)//c是操作数
i=0;
do
z[i]=c;
i++;
}while(c>
z[i]='
\0'
d=atof(z);
//将字符串数组转为符点型存于d
OD.Push(d);
else//c是非法字符
ERROR3"
d=OD.GetTop();
returnd;
(4)中缀表达式转换成后缀表达式:
创建一个操作符栈;
charc,x;
inti=0;
SqStack<
从左到右扫描读取表达式,执行下列运算,直至表达式结束符。
SqStack<
OP.Push('
//=是表达式结束标志
cout<
exp:
exp<
c=*exp++;
2.1:
如果是操作数,输出;
if((c>
)||c=='
{
postexp[i++]=c;
c=*exp++;
}
2.2:
如果是操作符A2,把操作符栈栈顶的操作符A2与它比较:
2.2.1:
A1<
A2,A2如操作符栈。
2.2.2:
A1=A2,从操作符栈退出一个操作符,不输出。
2.2.3:
A1>
A2,从操作符栈输出所有比A2优先级高的运算符,直至栈顶算符优先级小于A2,A2如操作符栈。
if(In(c))//是7种运算符之一
postexp[i++]='
'
x=OP.GetTop();
switch(Precede(x,c))
{
case'
postexp[i++]=OP.Pop();
//运算符出栈输出
break;
}
postexp[i]='
(4)中缀表达式转换成前缀表达式:
从右到左扫描读取表达式,执行下列运算,直至表达式结束符;
while(*exp!
='
)
*exp++;
OP.Push('
c=*exp--;
2.1:
if((c>
preexp[i++]=c;
c=*exp--;
2.2:
preexp[i++]='
preexp[i++]=OP.Pop();
preexp[i]='
}//while
(5)后缀表达式求值:
创建一个栈,作为操作数栈;
执行下列操作,直到表达式结束;
读取表达式:
c=*postexp++;
如果是操作数,入操作数栈;
)//为操作数
i=0;
do
z[i++]=c;
c=*postexp++;
}while(c>
z[i]='
d=atof(z);
OD.Push(d);
2.3如果是操作符A,从操作数栈推出两个操作数a,b,进行运算。
并把运算结果入操作数栈;
if(In(c))//c为运算符
b=OD.Pop();
a=OD.Pop();
OD.Push(Operate(a,c,b));
c=*postexp++;
Step3:
栈顶元素即为表达式的值,返回它;
v=OD.Pop();
returnv;
(6)前缀表达式求值;
c=*preexp--;
c=*preexp--;
c=*preexp--;
(7)界面设计:
界面要求简洁明了,能够方便用户进行功能选择,菜单界面如下:
1-创建表达式
2-表达式求值
3-求后缀表达式
4-后缀表达式求值
5-求前缀表达式
6-前缀表达式求值
7-显示表达式
8-退出
4.运行与测试
(1)运行程序,显示菜单,如图所示:
(2)创建表达式,由中前后缀表达式计算结果如下图所示:
(3)将中缀表达式转化为前后缀表达式:
5.调试记录及收获
本次试验为表达式求值实验,首先需要对表达式进行输入存入处理,这就需要利用栈的特性,中缀表达式和中转后都比较容易写出,就是中转前需要将表达式从后往前遍历,这就需要将指针先移到字符串的尾端,我这里运用了while(*exp!
*exp++;
的代码,将exp移到最后,,从右往左对c赋值,然后进行比较。
此时得到的前缀表达式就是347–2*/1+,此时利用栈的特性,后进先出,将栈顶元素先行压出,这就反转成了前缀表达式+1/*2–743,此时就大功告成了。
本次试验中,实现了表达式的求值和中缀表达式转换成前后缀表达式,更重要的是,我理解了栈的使用方法以及指针的运用方式。
附录:
程序清单:
头文件:
//顺序栈类定义
template<
classT>
classSqStack
//栈底指针
//栈顶
//栈容量
//构建函数
}//析构函数
//入栈
//出栈
//获取栈顶元素
//测栈空
//清空栈
//返回栈顶指针
//显示栈中元素
//顺序栈类实现
T>
SqStack(intm)
base=newT[m];
stacksize=m;
}
voidSqStack<
Push(Tx)
if(top==stacksize-1)throw"
top++;
base[top]=x;
//cout<
top:
top<
TSqStack<
Pop()
Tx;
x=base[top--];
returnx;
GetTop()
returnbase[top];
intSqStack<
StackEmpty()
if(top==-1)
return0;
ClearStack()
StackTop()
{//返回栈顶指针
StackTranverse()
inti=top;
主函数:
#include<
iostream.h>
//cout,cin
#include"
process.h"
//exit()
stdio.h"
//EOF,NULL
string.h>
stdlib.h>
//atoi()
SqStack.h"
charpause;
{//算符的优先级比较
intIn(charc)
floatVal_Exp(char*exp)
{//中缀表达式求值。
设OPTR和OPND分别为运算符栈和运算数栈
floata,b,d;
inti;
br
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 表达式 求值 问题