数据结构课程设计表达式求值完整版.docx
- 文档编号:3103211
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:19
- 大小:19.81KB
数据结构课程设计表达式求值完整版.docx
《数据结构课程设计表达式求值完整版.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计表达式求值完整版.docx(19页珍藏版)》请在冰豆网上搜索。
数据结构课程设计表达式求值完整版
XXXXXX大学
《数据结构》课程设计报告
班级:
学号:
姓名:
指导老师:
一算术表达式求值
1、需求分析
2、程序的主要功能
3、程序运行平台
4、数据结构
5、算法及时间复杂度
6、测试用例
7、程序源代码
二感想体会与总结
算术表达式求值
一、需求分析
一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。
假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:
#(7+15)*(23-28/4)#。
引入表达式起始、结束符是为了方便。
编程利用“算符优先法”求算术表达式的值。
二、程序的主要功能
(1)从键盘读入一个合法的算术表达式,输出正确的结果。
(2)显示输入序列和栈的变化过程。
三、程序运行平台
VisualC++6.0版本
四、数据结构
本程序的数据结构为栈。
(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
returnOK;
}
intPush(SqStack&s,chare)//运算符入栈
{
if(s.top-s.base>=s.stacksize)
{
printf("运算符栈满!
\n");
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入栈
returnOK;
}
intPop(SqStack&s,char&e)//运算符出栈
{
if(s.top==s.base)//栈为空栈的时候,返回ERROR
{
printf("运算符栈为空!
\n");
returnERROR;
}
else
{
e=*--s.top;//栈不为空的时候用e做返回值,删除S的栈顶元素,并返回OK
returnOK;
}
}
intStackTraverse(SqStack&s)//运算符栈的遍历
{
char*t;
t=s.base;
if(s.top==s.base)
{
printf("运算符栈为空!
\n");//栈为空栈的时候返回ERROR
returnERROR;
}
while(t!
=s.top)
{
printf("%c",*t);//栈不为空的时候依次取出栈内元素
t++;
}
returnERROR;
}
(2)数字栈部分:
structSqStackn//定义数栈
{
int*base;//栈底指针
int*top;//栈顶指针
intstacksize;//栈的长度
};
intInitStackn(SqStackn&s)//建立一个空栈S
{
s.base=(int*)malloc(50*sizeof(int));
if(!
s.base)exit(OVERFLOW);//存储分配失败
s.top=s.base;
s.stacksize=50;
returnOK;
}
intGetTopn(SqStackns,int&e)//数栈取栈顶元素
{
if(s.top==s.base)
{
printf("运算数栈为空!
\n");//栈为空的时候返回ERROR
returnERROR;
}
else
e=*(s.top-1);//栈不为空的时候,用e作返回值,返回S的栈顶元素,并返回OK
returnOK;
}
intPushn(SqStackn&s,inte)//数栈入栈
{
if(s.top-s.base>=s.stacksize)
{
printf("运算数栈满!
\n");//栈满的时候,追加5个存储空间
s.base=(int*)realloc(s.base,(s.stacksize+5)*sizeof(int));
if(!
s.base)exit(OVERFLOW);
s.top=s.base+s.stacksize;//插入元素e为新的栈顶元素
s.stacksize+=5;
}
*(s.top)++=e;//栈顶指针变化
returnOK;
}
intPopn(SqStackn&s,int&e)//数栈出栈
{
if(s.top==s.base)
{
printf("运算符栈为空!
\n");//栈为空栈的视时候,返回ERROR
returnERROR;
}
else
{
e=*--s.top;//栈不空的时候,则删除S的栈顶元素,用e返回其值,并返回OK
returnOK;
}
}
intStackTraversen(SqStackn&s)//数栈遍历
{
int*t;
t=s.base;
if(s.top==s.base)
{
printf("运算数栈为空!
\n");//栈为空栈的时候返回ERROR
returnERROR;
}
while(t!
=s.top)
{
printf("%d",*t);//栈不为空的时候依次输出
t++;
}
returnERROR;
}
五、算法及时间复杂度
1、算法:
建立两个不同类型的空栈,先把一个‘#’压入运算符栈。
输入一个算术表达式的字符串(以‘#’结束),从第一个字符依次向后读,把读取的数字放入数字栈,运算符放入运算符栈。
判断新读取的运算符和运算符栈顶得运算符号的优先级,以便确定是运算还是把运算符压入运算符栈。
最后两个‘#’遇到一起则运算结束。
数字栈顶的数字就是要求的结果。
2、时间复杂度:
O(n)
数据压缩存储栈,其操作主要有:
建立栈intPush(SeqStack*S,charx)
入栈intPop(SeqStack*S,charx)
出栈。
以上各操作运算的平均时间复杂度为O(n),其主要时间是耗费在输入操作。
6、测试用例
如图所示。
最终结果如图所示:
7、源代码
/**************************************************************************************************
第七题算术表达式求值
[问题描述]
一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。
假设操作数是正整数,
运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,
如:
#(7+15)*(23-28/4)#。
引入表达式起始、结束符是为了方便。
编程利用“算符优先法”求算术表达式的值。
[基本要求]
(1)从键盘读入一个合法的算术表达式,输出正确的结果。
(2)显示输入序列和栈的变化过程。
***************************************************************************************************/
#include
#include
#include
#include
#include
#include
#defineOK1
#defineERROR0
#defineSTACK_INIT_SIZE100
//#defineSTACKINCREMENT10
//========================================================
//以下定义两种栈,分别存放运算符和数字
//========================================================
//*******************运算符栈部分*************************
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
returnOK;
}
intPush(SqStack&s,chare)//运算符入栈
{
if(s.top-s.base>=s.stacksize)
{
printf("运算符栈满!
\n");
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入栈
returnOK;
}
intPop(SqStack&s,char&e)//运算符出栈
{
if(s.top==s.base)//栈为空栈的时候,返回ERROR
{
printf("运算符栈为空!
\n");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 表达式 求值 完整版