数据结构课程设计 表达式求值完整版Word文件下载.docx
- 文档编号:19199114
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:22
- 大小:45.89KB
数据结构课程设计 表达式求值完整版Word文件下载.docx
《数据结构课程设计 表达式求值完整版Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计 表达式求值完整版Word文件下载.docx(22页珍藏版)》请在冰豆网上搜索。
本程序的数据结构为栈。
(1)运算符栈部分:
structSqStack//定义栈
{
char*base;
//栈底指针
char*top;
//栈顶指针
intstacksize;
//栈的长度
};
intInitStack(SqStack&
s)//建立一个空栈S
if(!
(s.base=(char*)malloc(50*sizeof(char))))
exit(0);
s.top=s.base;
s.stacksize=50;
returnOK;
}
charGetTop(SqStacks,char&
e)//运算符取栈顶元素
if(s.top==s.base)//栈为空的时候返回ERROR
{
printf("
运算符栈为空!
\n"
);
returnERROR;
}
else
e=*(s.top-1);
//栈不为空的时候用e做返回值,返回S的栈顶元素,并返回OK
intPush(SqStack&
s,chare)//运算符入栈
if(s.top-s.base>
=s.stacksize)
printf("
运算符栈满!
s.base=(char*)realloc(s.base,(s.stacksize+5)*sizeof(char));
//栈满的时候,追加5个存储空间
if(!
s.base)exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=5;
*(s.top)++=e;
//把e入栈
intPop(SqStack&
s,char&
e)//运算符出栈
if(s.top==s.base)//栈为空栈的时候,返回ERROR
else
e=*--s.top;
//栈不为空的时候用e做返回值,删除S的栈顶元素,并返回OK
returnOK;
intStackTraverse(SqStack&
s)//运算符栈的遍历
{
char*t;
t=s.base;
if(s.top==s.base)
//栈为空栈的时候返回ERROR
while(t!
=s.top)
%c"
*t);
//栈不为空的时候依次取出栈内元素
t++;
}
(2)数字栈部分:
structSqStackn//定义数栈
int*base;
int*top;
intInitStackn(SqStackn&
s)//建立一个空栈S
s.base=(int*)malloc(50*sizeof(int));
s.base)exit(OVERFLOW);
//存储分配失败
intGetTopn(SqStackns,int&
e)//数栈取栈顶元素
if(s.top==s.base)
运算数栈为空!
//栈为空的时候返回ERROR
//栈不为空的时候,用e作返回值,返回S的栈顶元素,并返回OK
intPushn(SqStackn&
s,inte)//数栈入栈
=s.stacksize)
运算数栈满!
//栈满的时候,追加5个存储空间
s.base=(int*)realloc(s.base,(s.stacksize+5)*sizeof(int));
//插入元素e为新的栈顶元素
//栈顶指针变化
intPopn(SqStackn&
s,int&
e)//数栈出栈
运算符栈为空!
//栈为空栈的视时候,返回ERROR
//栈不空的时候,则删除S的栈顶元素,用e返回其值,并返回OK
intStackTraversen(SqStackn&
s)//数栈遍历
int*t;
运算数栈为空!
%d"
//栈不为空的时候依次输出
五、算法及时间复杂度
1、算法:
建立两个不同类型的空栈,先把一个‘#’压入运算符栈。
输入一个算术表达式的字符串(以‘#’结束),从第一个字符依次向后读,把读取的数字放入数字栈,运算符放入运算符栈。
判断新读取的运算符和运算符栈顶得运算符号的优先级,以便确定是运算还是把运算符压入运算符栈。
最后两个‘#’遇到一起则运算结束。
数字栈顶的数字就是要求的结果。
2、时间复杂度:
O(n)
数据压缩存储栈,其操作主要有:
建立栈intPush(SeqStack*S,charx)
入栈intPop(SeqStack*S,charx)
出栈。
以上各操作运算的平均时间复杂度为O(n),其主要时间是耗费在输入操作。
如图所示。
最终结果如图所示:
7、源代码
/**************************************************************************************************
第七题算术表达式求值
[问题描述]
假设操作数是正整数,
运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,
如:
[基本要求]
***************************************************************************************************/
#include<
stdio.h>
string.h>
stdlib.h>
math.h>
conio.h>
ctype.h>
#defineOK1
#defineERROR0
#defineSTACK_INIT_SIZE100
//#defineSTACKINCREMENT10
//========================================================
//以下定义两种栈,分别存放运算符和数字
//*******************运算符栈部分*************************
//**********************数字栈部分***************************
//以下定义函数
intIsoperator(charch)//判断是否为运算符,分别将运算符和数字进入不同的栈
switch(ch)
case'
+'
:
-'
*'
/'
('
)'
#'
return1;
default:
return0;
intOperate(inta,charop,intb)//运算操作
intresult;
switch(op)
result=a+b;
break;
result=a-b;
result=a*b;
result=a/b;
returnresult;
charPrecede(charch1,charch2)//运算符优先级的比较
{
charp;
switch(ch1)
if(ch2=='
||ch2=='
)
p='
>
'
;
//ch1运算符的优先级小于ch2运算符
else
<
break;
if(ch2=='
p='
='
elseif(ch2=='
{
printf("
表达式错误!
运算符不匹配!
);
exit(0);
}
else
break;
p='
p='
}
returnp;
//以下是求值过程
intEvaluateExpression()//参考书p53算法3.4
{
inta,b,temp,answer;
charch,op,e;
char*str;
intj=0;
SqStacknOPND;
//OPND为运算数字栈
SqStackOPTR;
//OPTR为运算符栈
InitStack(OPTR);
Push(OPTR,'
//,所以此栈底是'
,因为运算符栈以'
作为结束标志
InitStackn(OPND);
//printf("
\n\n按任意键开始求解:
\n\n"
//ch=getch();
\n请输入表达式并以'
结束:
str=(char*)malloc(50*sizeof(char));
gets(str);
ch=str[j];
//ch是字符型的,而e是整型的整数
j++;
GetTop(OPTR,e);
//e为栈顶元素返回值
while(ch!
||e!
)
Isoperator(ch))//遇到数字,转换成十进制并计算
temp=ch-'
0'
//将字符转换为十进制数
ch=str[j];
j++;
while(!
Isoperator(ch))
{
temp=temp*10+ch-'
//将逐个读入运算数的各位转化为十进制数
ch=str[j];
j++;
}
Pushn(OPND,temp);
elseif(Isoperator(ch))//判断是否是运算符,不是运算符则进栈
switch(Precede(e,ch))
:
Push(OPTR,ch);
//栈顶元素优先权低
ch=str[j++];
printf("
\n\n运算符栈为:
//输出栈,显示栈的变化
StackTraverse(OPTR);
\n运算数栈为:
StackTraversen(OPND);
break;
case'
Pop(OPTR,op);
//脱括号并接收下一字符
ch=str[j++];
\n数栈为:
//弹出最上面两个,并运算,把结果进栈
Popn(OPND,b);
Popn(OPND,a);
Pushn(OPND,Operate(a,op,b));
您的输入有问题,请检查重新输入!
"
exit(0);
//取出运算符栈最上面元素是否是'
}//while
GetTopn(OPND,answer);
//已输出。
数字栈最上面即是最终结果
returnanswer;
//执行部分
voidShowMenu()
prin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课程设计 表达式求值完整版 数据结构 课程设计 表达式 求值 完整版
![提示](https://static.bdocx.com/images/bang_tan.gif)