2009~ 2010 学年度第二学期
赣南师范学院数学与计算机科学学院
数据结构课程设计报告册
课程设计名称:后缀表达式的计算
专
班
学
姓
业: 信息与计算科学
级:
号:
名:
07*****本
0707*****
******
指 导 老 师:
王**老师
课程设计任务一览表
序号 课程设计任务名称
设计专题任务描述(可附页)
1 问题的描述和分析
设计一个程序,实现中缀表达式与后缀表达之间的转换
并对后缀表达式进行计算并输出结果
2
3
4
5
6
算法的设计
见设计报告
数据结构的设计
见设计报告
具体程序的实现
见设计报告
界面设计
见设计报告
调试情况
在文档 a 中输入 5+6*6-9-8,执行程序,选择 a.txt。
选择功能 1 查看到文档 a 中的中缀表达式 5+6*6-9-8。
选择功能 2 查看到对应的后缀表达式为 566*+9-8-。
选择功能 3 计算出后缀表达式的计算结果为 24。
选择功能 4 成功将程序运行并保存结果。
选择功能 5 成功查看到上一次的运行结果也为 24
选择功能 6 成功关闭程序
算法的分析和评价
7
及本次上机实验的
心得
这次实验很成功,在初次的设计目的上增加了中缀表达式
与后缀表达式的转换功能,这样少了繁杂的后缀表达式录
入过程,操作相对变得简易,减轻了用户的工作量。以后
的实验及作品我们也要注重这方面改正,这样不仅能提高
自己的能力,也能方便使用者。
指导用书:_
__
课程设计报告
1
名 称
后缀表达式的计算
计算机
附属
设备
U 盘
VC6.0
起止时间
2010 年 4 月 1 日
— 2010 年 5 月 1 日
设计项目
编 号
主要
仪器
设备
主要
使用
软件
课程设计任务书
同组人
***
1. 问题的描述和分析
2. 算法的设计
3. 数据结构的设计
4. 具体程序的实现
5. 界面设计
6. 调试情况
7. 算法的分析和评价及本次上机实验的心得
课 程 设 计 报 告
一、算法的设计:
后缀表达式运算的思想为依次读入表达式中的每一个字符,若当前字符是运算对象,入对象栈,是运算符
时,若这个运算符比栈顶运算符高则入栈,继续向后处理,若这个运算符比栈顶运算符低则从对象栈出栈
两个运算量,从算符栈出栈一个运算符进行,并将运算结果入对象栈,继续处理当前字符,直到遇到结束
符。
根据运算规则,每个运算符栈内、栈外的级别如下:
算符
^
*、/、%
+、-
(
)
栈内级别
栈外级别
3
2
1
0
-1
4
2
1
4
-1
后缀表达式的结果计算主要涉及的数据结构为栈结构,包括下面一些操作,如进栈、出栈、判断栈是否为
空 、及栈是否为满、读栈顶元素等操作,同时也涉及了文件的读取及输出等操作。
设计如下几个函数模块:
pseqstack creatnullstack();/*创建空栈*/
char *fileread(char *infix,char *filename); /*读取文件*/
void push(pseqstack pstack,char c); /*算符入栈*/
void pushu(pseqstack pstack,int num); /*操作数入栈*/
void pop(pseqstack pstack); /*出栈*/
char top(pseqstack pstack); /*读取栈顶算符*/
int topshu(pseqstack pstack); /*读取栈顶操作数*/
int isempty(pseqstack pstack); /*判断栈是否为空*/
char *infixtosuffix(char *infix,char *suffix); /*中缀表达式转换成后缀表达式*/
int caculatesuffix(char *suffix); /*后辍表达式结果计算*/
void filewrite(char *infix,char *suffix); /*文件输出*/
void filedisplay(char *infix,char *suffix); /*打开文件*/
void putscreen();/*屏显*/
二、数据结构的设计
两个栈包括在一个数据结构里面,通过对读取的字符类型进行判断来决定它该入哪个栈。
struct seqstack
{
int m;
int t;
char s[100]; /*算符栈*/
int shu[100]; /*对象栈*/
};
三、具体程序的实现
#include
#include
#include
#include
#define FALSE 0
#define TRUE 1
#include"head.h"
pseqstack creatnullstack()/*创建空栈*/
{
pseqstack pstack=(pseqstack)malloc(sizeof(struct seqstack));
if(pstack)
{
pstack->m=0;
pstack->t=-1;
}
else
printf("Out of Space!\n");
return pstack;
}
char *fileread(char *infix,char *filename) /*从文件中读入表达式*/
{
FILE *fp;
int i=0;
if((fp=fopen(filename,"rb"))==NULL)
{
printf("%s 文件不存在!\n 请先建立文件!\n",filename);
exit(0);
}
while(!feof(fp))
{
infix[i++]=fgetc(fp);
}
infix[i-1]='\0';
fclose(fp);
return infix;
//printf("中缀表达式为:\n%s",infix);
}
void filewrite(char *infix,char *suffix) /*打开文件*/
{
FILE *fp;
char temp[100],buff[50];
if((fp=fopen("result.txt","wb"))==NULL)
{
printf("写文件出错!\n");
exit(0);
}
strcpy(temp,infix);
strcat(temp,suffix);
itoa(caculatesuffix(suffix),buff,10);//整型转字符型
strcat(temp,buff);
fwrite(temp,strlen(temp),1,fp);//写文件
fclose(fp);
}
void filedisplay(char *infix,char *suffix) /*打开文件*/
{
FILE *fp;
char tmp[50];
int i=0;
if((fp=fopen("result.txt","rb"))==NULL)
{
printf("文件不存在,请先保存数据!\n");
exit(0);
}
printf("中缀表达式为:\n");
fread(tmp,strlen(infix),1,fp);
tmp[strlen(infix)]='\0';
printf("%s\n",tmp);
printf("后缀表达式为:\n");
fread(tmp,strlen(suffix),1,fp);
tmp[strlen(suffix)]='\0';
printf("%s\n",tmp);
printf("计算结果为:\n");
while(!feof(fp))
tmp[i++]=fgetc(fp);
tmp[i-1]='\0';
printf("%s\n",tmp);
}
void push(pseqstack pstack,char c) /*算符入栈*/
{
pstack->t=pstack->t+1;
pstack->s[pstack->t]=c;
pstack->m++;
}
void pushu(pseqstack pstack,int num) /*操作数入栈*/
{
pstack->t=pstack->t+1;
pstack->shu[pstack->t]=num;
pstack->m++;
}
void pop(pseqstack pstack) /*出栈*/
{
pstack->t=pstack->t-1;
pstack->m--;
}
char top(pseqstack pstack) /*读栈顶算符*/
{
return(pstack->s[pstack->t]);
}
int topshu(pseqstack pstack) /*读栈顶操作数*/
{
return(pstack->shu[pstack->t]);
}
int isempty(pseqstack pstack) /*栈断栈是否为空*/
{
if(pstack->t==-1)
else
return 1;
return 0;
}
char *infixtosuffix(char *infix,char *suffix) /*中缀表达式转换成后缀表达式*/
{
int state=0;
char c,c2;
int i,j=0;
pseqstack ps=creatnullstack();
if(infix[0]=='\0')
exit(0);
for(i=0;infix[i]!='\0';i++)
{
c=infix[i];
switch(c)
{
case' ':
case'\t':
case'\n':
if(state==1)
suffix[j++]=' ';
state=0;
break;
case'0':
case'1':
case'2':
case'3':
case'4':
case'5':
case'6':
case'7':
case'8':
case'9':
state=1;
suffix[j++]=c;
break;
case'(':
if(state==1)
suffix[j++]=' ';
state=0;
push(ps,c);
break;
case')':
if(state==1)
suffix[j++]=' ';
state=0;
while(!isempty(ps))
{