操作结果:若栈为空,则返回S的栈顶元素;否则返回ERROR。 (2). void Push(SqStack *S,int e) 初始条件:栈存在;
操作结果:插入e为新的栈顶元素。 (3). int Pop(SqStack *S) 初始条件:栈存在;
操作结果:若栈不空,则删除之,并返回其值;否则返回REEOR。(4).void InitStack(SqStack *S) 初始条件:栈存在; 操作结果:置栈为空。 (5). int Empty(SqStack *S) 初始条件:栈存在;
操作结果:判定S是否为空栈。
4.4主程序的模块调用
主程序 读入字符 输入字符有效及优先级的判断 运算模块 输出结果 图4.4主程序模块图
5
4.5主要实现的功能函数
4.5.1包含的主要函数功能所具有的功能
Initstack():构造一个空栈 Push():插入元素进栈 GetTop():返回栈顶元素 Pop():字符元素出栈
get():从输入的字符串中依次读入每一个字符
4.5.2数据结构设计 具体结构定义如下:
#define StackSize 100 #define QueueSize 100 typedef char DataType; typedef struct { char data[100]; int front,rear; }SeqQueue;
5详细设计
5.1功能模块详细设计
5.1.1详细设计思想
求解表达式的主要思想是创建两个栈,一个是符号栈,另一个是数字栈。符号栈关键是运算优先顺序,数字栈关键是多位数与小数的计算。本程序设计了四个模块,第一个模块void CTpostExp(SeqQueue *Q),主要目的是进行加减乘除的
6
操作方法;第二个模块int Priority(DataType op),主要目的是对用户输入的算术表达式进行求解,是运算符的优先顺序;第三个模块是主函数,主要目的是将上述模块集中运行,进行求解。至此完成利用栈结构求解表达式运算。
5.2中缀表达式转换成后缀表达式
先初始化栈,然后将‘=’进栈,读取字符,若它为数字,则一次存入CTpostExp中,并以‘#’标志结束,若为运算符,则和栈顶运算符比较,如果栈顶运算符优先级则该运算符进栈。待字符串扫描完毕,则将运算符栈中‘=’之前所有运算符出栈并存放postQ中,最后得到后缀表达式CpostExp.
5.3后缀表达式求值
从左到右读入后缀表达式,若读入的是一个操作数,就将它入数值栈。若读入的是一个运算符,就从数值栈中连续出栈两个元素,并将计算结果入数值栈,对整个后缀表达式读入结束时,栈顶元素就是计算结果。
6运行与测试
测试结果
9-(2+4*7)/5+3#,输出结果为:9247*+5/-3+,值为6
5*(5-2)#,输出结果为:552-*,值为15
7
7总结和心得
参考文献
[1] 《数据结构课程设计》-----苏仕华 等编著 [2] 《数据结构(C语言版)》-----严蔚敏 吴伟民编著 [3] 《C程序设计(第三版)》------谭浩强 著
8
8.附:源代码
#include
char data[100]; int front,rear;
}SeqQueue; //定义队列类型
void InitQueue(SeqQueue * Q) //初始化队列 {
Q->front=0; Q->rear=0; }
int QueueEmpty(SeqQueue * Q) //判空队列 {
return Q->rear==Q->front ; }
void EnQueue(SeqQueue *Q,DataType x) //入队列{
if((Q->rear +1) % QueueSize ==Q->front ) printf(\ else {
Q->data[Q->rear]=x;
Q->rear=(Q->rear+1) % QueueSize; } }
DataType DeQueue(SeqQueue *Q) //删除队列 {
DataType e; if(Q==NULL)
printf(\ else {
e=Q->data[Q->front];
Q->front=(Q->front+1) % QueueSize; }
return e; }
9