数据结构课程设计--利用栈求表达式的值-可供小学生作业-并能给出分数

合集下载

数据结构课程设计可选题目

数据结构课程设计可选题目

数据结构课程设计可选题目一、课程设计的目的学习数据结构与算法的最终目的是解决实际的应用问题,特别是非数值计算类型的应用问题。

课程设计要求同学独立完成一个较为完整的应用需求分析,在完成设计和编程大型作业的过程中,深化对数据结构与算法课程中基本概念、理论和方法的理解;训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念;使同学的程序设计与调试水平有一个明显的提高。

二、数据结构课程设计可选题目1. 运动会分数统计(限1 人完成)任务:参加运动会有n个学校,学校编号为1……n。

比赛分成m个男子项目,和w个女子项目。

项目编号为男子1……m,女子m+1……m+w。

不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。

(m<=20,n<=20)功能要求:1) 可以输入各个项目的前三名或前五名的成绩;2) 能统计各学校总分,3) 可以按学校编号或名称、学校总分、男女团体总分排序输出;4) 可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校;5) 数据存入文件并能随时查询;6) 规定:①输入数据形式和范围:可以输入学校的名称,运动项目的名称;②输出形式:有中文提示,各学校分数为整形;③界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。

④存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。

(数据文件的数据读写方法等相关内容在c语言程序设计的书上)请在最后的上交资料中指明你用到的存储结构;⑤测试数据:要求使用a.全部合法数据;b.整体非法数据;c.局部非法数据进行程序测试,以保证程序的稳定。

测试数据及测试结果请在上交的资料中写明。

2. 飞机订票系统任务:通过此系统可以实现如下功能:⑴录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)⑵查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);⑶可以输入起飞抵达城市,查询飞机航班情况;⑷订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;⑸退票:可退票,退票后修改相关数据文件;⑹客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。

数据结构课程设计- 算术表达式求值

数据结构课程设计- 算术表达式求值

课程设计报告课程名称数据结构课程设计题目算术表达式求值指导教师设计起始日期 4.18~4.25学院计算机学院系别计算机科学与工程学生姓名班级/学号成绩一、需求分析设计一个算术表达式四则运算的程序,要求完成包括加、减、乘、除运算,包含括号的基本整数表达式的运算。

在这里运算数可以1位长度,也可以多位长度。

在运算之后输出的正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。

(1)输入:3*(7-2)(2)输出:数据栈栈顶元素:3,7,2,7,5,3,15结果:15(3)自选数据二、概要设计1、使用栈的数据结构表示数据的存储。

2、设计算法将中缀表达式转换成后缀表达式,用栈的数据结构实现表达式的运算。

3、把中缀表达式转换为后缀表达式算法的基本思路是从头到尾地扫描中缀表达式中的每个字符,对于不同类型的字符按不情况进行处理。

三、详细设计数据结构:字符类型栈/* 定义字符类型栈*/typedef struct{char stackname[20];char *base;char *top;} Stack;算法:将中缀表达式转换为后缀表达式void Change(char* s1, char* s2)// 将字符串s1中的中缀表达式转换为存于字符串s2中的后缀表达式{Stack R; // 定义用于暂存运算符的栈InitStack(R); // 初始化栈Push(R,'#'); // 给栈底放入’#’字符,它具有最低优先级0int i,j;i=0; // 用于指示扫描s1串中字符的位置,初值为0j=0; // 用于指示s2串中待存字符的位置,初值为0char ch=s1[i]; // ch保存s1串中扫描到的字符,初值为第一个字符while( ch!='#'){ // 顺序处理中缀表达式中的每个字符if(ch==' ')// 对于空格字符不做任何处理,顺序读取下一个字符ch=s1[++i];else if(ch=='('){ // 对于左括号,直接进栈Push(R,ch);ch=s1[++i];}else if(ch==')'){ // 对于右括号,使括号内的仍停留在栈中的运算符依次// 出栈并写入到s2中while(Peek(R)!='(')s2[j++]=Pop(R);Pop(R); // 删除栈顶的左括号ch=s1[++i];}else if(ch=='+'||ch=='-'||ch=='*'||ch=='/'){ // 对于四则运算符,使暂存在栈中的不低于ch优先级// 的运算符依次出栈并写入到s2中char w=Peek(R);while(Precedence(w)>=Precedence(ch)){ // Precedence(w)函数返回运算符形参的优先级s2[j++]=w;Pop(R); w=Peek(R); }}四、调试分析调试:在设计过程中出现程序不能运行,发现不能找到结束标识符,因此在设计的时候需要人为动态添加结束标识符‘#’,顺利运行算法时间和空间分析:算法的运行时间主要花在while循环上,它从头到尾扫描后缀表达式中的每一个数据(每个操作数或运算符均为一个数据),若后缀表达式由n个数据组成,则此算法的时间复杂度为O(n)。

《算法设计综合实训》题目讲解

《算法设计综合实训》题目讲解

算法设计综合实训题目0.逆序数字(借助栈)编写一个函数,接收一个4位整数值,返回这个数中数字逆序后的结果值。

例如,给定数7631,函数返回1367.输入:第一行一个正整数T(T<=10),表示有T组测试数据; 以下T行,每行一个非负的整数N。

输出:共T行,对于每组输入数据输出一行,即数字逆序后的结果值。

样本输入:3763110185158样本输出:1367810185151.人见人爱A+B这个题目的A和B不是简单的整数,而是两个时间,A和B 都是由3个整数组成,分别表示时分秒,比如,假设A为34 45 56,就表示A所表示的时间是34小时 45分钟 56秒。

输入:输入数据有多行组成,首先是一个整数N,表示测试实例的个数,然后是N行数据,每行有6个整数AH,AM,AS,BH,BM,BS,分别表示时间A和B所对应的时分秒。

题目保证所有的数据合法。

输出:对于每个测试实例,输出A+B,每个输出结果也是由时分秒3部分组成,同时也要满足时间的规则(即:分和秒的取值范围在0-59),每个输出占一行,并且所有的部分都可以用32位整数表示。

样本输入:21 2 3 4 5 634 45 56 12 23 34样本输出:5 7 947 9 302.敲七【问题描述】输出7和7的倍数,还有包含7的数字例如(17,27,37...70,71,72,73...)【要求】【数据输入】一个整数N。

(N不大于30000)【数据输出】从小到大排列的不大于N的与7有关的数字,每行一个。

【样例输入】20【样例输出】714173.统计同成绩学生人数问题【问题描述】读入N名学生的成绩,将获得某一给定分数的学生人数输出。

【要求】【数据输入】测试输入包含若干测试用例,每个测试用例的格式为第1行:N第2行:N名学生的成绩,相邻两数字用一个空格间隔。

第3行:给定分数当读到N=0时输入结束。

其中N不超过1000,成绩分数为(包含)0到100之间的一个整数。

数据结构课程设计报告-表达式求值

数据结构课程设计报告-表达式求值

《数据结构》课程设计利用栈求表达式的值班级: 2学号: 100171021330姓名:吴迪指导老师:王方利用栈求表达式的值1、设计思路这个程序的关键是对数字与运算符的判断和运算符优先级的判断,以及出栈的运算。

建立两个栈,分别存储数字与运算符,栈1存运算符,栈2存数字。

依次读取表达式的字符串,先判断是数字还是运算符,如果是数字不能马上压入栈2,因为可能是大于10的数字,应该继续循环,如果还是数字,则利用计算保存数值,直到指到运算符时停止,将计算后的数字压入栈2。

压入运算符之前先将要压入的与栈顶的运算符优先级相比较,如果栈顶是‘(’而当前不是‘)’,则不需比较优先级,直接压入;如果栈顶是‘(’,当前是‘)’,则抵消(弹出‘(’,指向表达式下一个字符);若当前的运算符优先级大于栈顶的,则压入;若当前的运算符优先级小于栈內时,弹出栈顶的运算符,同时弹出两组数字,经过运算符的运算后再重新压到栈内。

为了方便判断运算结束,在存储运算符之前先将‘#’压入栈1中,在输入表达式时以‚#‛结束,所以可以以运算符==‘#’并且栈1顶==‘#’来结束运算,弹出栈2的数值,即为表达式求值的最终结果。

上述操作的算法步骤:(1)初始化算符S1,数字栈S2;,将‘#’压入算符栈S1中。

(2)读表达式字符=>w。

(3)当栈顶为‘#’并且w也是‘#’时结束;否则循环做下列步骤:(3-1)如果w是数字,存储到m,再经过计算存储到num中。

m=w-‘0’;num=num*pow(10,n)+m;n++;读下一个字符=>w,如果是运算符,则跳出循环;转3-2。

(3-2)w若是运算符,则:(3-2-1)如果栈顶为‘(’并且w为‘)’则‘(’出栈,读下一个字符=>w;转(3)。

(3-2-2)如果栈顶为‘(’或者栈顶优先级小于w优先级,则w入栈,读下一个字符=>w;转(3)。

否则:从算符栈中出栈,并从数字栈中弹出两组数字进行运算,将结果重新压入数字栈,转(3)。

【数据结构与数据库-实验报告】表达式求值(栈)

【数据结构与数据库-实验报告】表达式求值(栈)

8 / 20
版权归原作者 Amber 所有
break; } } return GetTop2(OPND); } int main( ) { printf("请输入正确的表达式以'#'结尾:"); do{ gets(expr); }while(!*expr); InitStack(&OPTR); /* 初始化运算符栈 */ Push(&OPTR,'#'); /* 将#压入运算符栈 */ InitStack2(&OPND); /* 初始化操作数栈 */ printf("表达式结果为:%d\n", EvalExpr()); return 0; }
6 / 20
版权归原作者 Amber 所有
case '+' : return (a+b); case '-' : return (a-b); case '*' : return (a*b); case '/' : return (a/b); } return 0; } 8、返回操作数的长度 int num(int n) { char p[10]; itoa(n,p,10);//把整型转换成字符串型 n=strlen(p); return n; } 9、主要操作函数 int EvalExpr() { char c,theta,x; int n,m; int a,b; c = *ptr++; while(c!='#'||GetTop(OPTR)!='#') {
版权归原作者 Amber 所有
数据结构与数据库 实验报告
题 院 姓 学

利用栈求表达式的值,可供小学生作业,并能给出分数 数据结构课程设计说明书格式

利用栈求表达式的值,可供小学生作业,并能给出分数 数据结构课程设计说明书格式

中北年夜学之迟辟智美创作数据结构 课程设计说明书1. 设计任务概述(包括系统总体框图及功能描述)此课题是研究表达式求值的问题,以帮手小学生完成测试.为了到达这个功能,实际我们要做的就是出题,和计算分数给出评价的工作.整体设计都是以这个要求为轴心进行的.为了直观和方便,现画出软件整体设计模块图.2.计法式完胜利能;3. 功能模块详细设计在此说明每个部份的算法设计说明(可以是描述算法的流程图),每个法式中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的界说).3.1 详细设计思想学生要进行测试,首先要有试题.那么我们就要先建立试题库.这个试题库的试题是我们在法式运行过程中手动输入,寄存在一个shujuku.txt的文件中.首先在主函数中调用创立试题库函数,将试题存入到试题库文件shitiku.txt中,然后将该调用从主函数中删除.创立试题库函数:创立指向xuanti类型的指针,利用循环将输入的测试题该指针的xuanti单位中,最后将该指针中的测试题写入试题库文件shitiku.txt中.3.2 核心代码(正文宋体小四号字,1.5倍行距)#include <stdio.h>#include <stdlib.h>#include <time.h>#include<string.h>#include <conio.h>#define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define ERROR 0#define OK 1//界说表达式typedef struct shiti{char a[20];long result;}xuanti;typedef struct SqStack1{ //建立数字栈int *base;int *top;int stacksize;}SqStack1;typedef struct SqStack2{//建立运算符栈char *base;char *top;int stacksize;}SqStack2;void WriteToFile(xuanti *pstu,int num);void ReadFromFile(xuanti *pstu,int num);void page_title(char *menu_item){//建立菜单printf(">>> 数学习题库 <<<\n\n- %s -\n\n",menu_item); }void return_confirm(){printf("\n按任意键返回……\n");getch();}void IntInitStack(SqStack1 *S1){S1->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int)); if(!S1->base)exit(ERROR);S1->top=S1->base;S1->stacksize=STACK_INIT_SIZE;}//IntInitStackvoid CharInitStack(SqStack2 *S2){S2->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char)); if(!S2->base)exit(ERROR);S2->top=S2->base;S2->stacksize=STACK_INIT_SIZE;}//CharInitStacklong IntGetTop(SqStack1 *S1){ //取栈顶元素long e1;if((*S1).top==(*S1).base)return 0;e1=*((*S1).top-1);return e1;}//IntGetTopchar CharGetTop(SqStack2 *S2){ //取栈顶元素char e2;if((*S2).top==(*S2).base) return 0;e2=*((*S2).top-1);return e2;}//IntGetTopint IntPush(SqStack1 *S1,int e1)*(*S1).top++=e1;return OK;}//IntPushint CharPush(SqStack2 *S2,char e2) {//入栈*(*S2).top++=e2;return OK;}//CharPushint IntPop(SqStack1 *S1){//出栈int e1;if((*S1).top==(*S1).base)return 0;e1=*--(*S1).top;return e1;}//IntPopint CharPop(SqStack2 *S2){//出栈char e2;if((*S2).top==(*S2).base) return 0; e2=*--(*S2).top;}//CharPopchar Precede(char a,char b){int i,j;char Table[8][8]={ ' ','+','-','*','/','(',')','#', '+','>','>','<','<','<','>','>','-','>','>','<','<','<','>','>','*','>','>','>','>','<','>','>','/','>','>','>','>','<','>','>','(','<','<','<','<','<','=',' ',')','>','>','>','>',' ','>','>','#','<','<','<','<','<',' ','=', }; //优先级表格for(i=0;i<8;i++)if(Table[0][i]==a) //纵坐标寻找 break;for(j=0;j<8;j++) //横坐标寻找 if(Table[j][0]==b)break;return Table[j][i];}//Precedeint Operate(int a,char theta,int b){ //计算表达式值:主要是将年夜的表达式转化成小的表达式进行逐步求值int c;if(theta=='+') c=a+b;else if(theta=='-') c=a-b;else if(theta=='*') c=a*b;else c=a/b;return c;}//Operateint IsOptr(char ch){char ptr[10]={'+','-','*','/','(',')','#'};for(int i=0;i<7;i++){if(ch==ptr[i])return true;}return false;}long result(char *a,SqStack1 *OPND,SqStack2 *OPTR){//求值char theta;int b,d,k=0,i=0,j=0,num2=0;IntInitStack(OPND);CharInitStack(OPTR);CharPush(OPTR,'#');while(a[i]!='='){if(!IsOptr(a[i])){k++;if(k<=j){num2=(int(a[i])-48);i++;}if(k>j){num2=num2*10+(int(a[i])-48); k=j=0;i++;}if(!IsOptr(a[i]))k++;if(k==j)IntPush(OPND,num2);}else if(IsOptr(a[i])){switch(Precede(a[i],CharGetTop(OPTR))) {case '<':CharPush(OPTR,a[i++]);if(a[i]!='('&&a[i]!=')')j++;break;case '=':CharPop(OPTR);i++;break;case '>':theta=CharPop(OPTR);d=IntPop(OPND);b=IntPop(OPND);IntPush(OPND,Operate(b,theta,d)); break;}//switch} //else if}//whileprintf("表达式的正确结果为:");printf("%d\n",IntGetTop(OPND));return (IntGetTop(OPND));}//reslutvoid Built_shitiKu(){int i,num;xuanti *pstu;printf("输入试题数目:\n");scanf("%d",&num);fflush(stdin);pstu=(xuanti *)malloc(num*sizeof(xuanti));//静态分配内存 if(pstu==NULL){printf("没有足够的内存空间!\n");return;}for(i=0;i<num;i++){//输入试题printf("第%d道试题:",i+1);gets(pstu[i].a);fflush(stdin);printf("\n");}WriteToFile(pstu,num);//将pstu所指向的学生信息写入文件中memset(pstu,0,num*sizeof(xuanti));//将pstu所指向的内存块清0ReadFromFile(pstu,num);//从文件中读取学生信息到pstu 所指向的内存块中printf("试题列表:\n");for(i=0;i<num;i++){//输入试题printf("第%d道试题:",i+1);printf("%s",pstu[i].a);printf("\n");}free(pstu);//释放静态分配的内存}void WriteToFile(xuanti *pstu,int num)FILE *fp;fp=fopen("shitiku.txt","at");if(fp==NULL){printf("不能创立shitiku.txt\n");free(pstu);exit(0);}fwrite(pstu,sizeof(xuanti),num,fp);fclose(fp);}void ReadFromFile(xuanti *pstu,int num){//从试题库中提取试题FILE *fp;fp=fopen("shitiku.txt","rt");if(fp==NULL){printf("不能翻开shitiku.txt\n");free(pstu);exit(0);}fread(pstu,sizeof(xuanti),num,fp);fclose(fp);}//****************************************** void RecMark(int *m,int num)FILE *mp;mp=fopen("markrec.txt","at");if(mp==NULL){printf("不能创立markrec.txt\n"); free(m);exit(0);}fwrite(m,sizeof(int),num,mp);fclose(mp);}//Recmarkvoid LookMark(int *m,int num){//检查得分记录FILE *mp;mp=fopen("markrec.txt","rt");if(mp==NULL){printf("不能翻开markrec.txt\n"); free(m);exit(0);}fread(m,sizeof(int),num,mp);fclose(mp);}//************************************* void RecN(int *m,int num)FILE *mp;mp=fopen("n_rec.txt","wt");if(mp==NULL){printf("不能创立n_rec.txt\n");free(m);exit(0);}fwrite(m,sizeof(int),num,mp);fclose(mp);}//Recmarkvoid LookN(int *m,int num){//检查m的值FILE *mp;mp=fopen("n_rec.txt","rt");if(mp==NULL){printf("不能翻开n_rec.txt\n");free(m);}fread(m,sizeof(int),num,mp);fclose(mp);}//************************************* int excersice_begin(){int i, j, temp, KEY[20];int mark,count=0;int *Mark;char g;SqStack1 s1,*OPND;SqStack2 s2,*OPTR;xuanti *XT;OPND=&s1;OPTR=&s2;Mark=(int *)malloc(20*sizeof(int));XT=(xuanti *)malloc(20*sizeof(xuanti));ReadFromFile(XT,20);do{srand((unsigned)time(NULL));KEY[0] = rand()%20;for(i=1;i<20;i++){while(1){temp = rand()%20;for(j=0;j<i;j++){if(KEY[j]==temp)break;}if(j==i){KEY[i]=temp;break;}}}system("cls");printf("随机的10个练习题 :\n");for(i=0;i<10;i++){printf("第%d个练习题:",i+1);printf("%s\n",XT[KEY[i]].a);printf("请输入计算结果:");scanf("%ld",&XT[KEY[i]].result);fflush(stdin);if(XT[KEY[i]].result==result(XT[KEY[i]].a,OPND,OPTR)) {mark+=10;printf("谜底正确!");printf("\n\n");}else{printf("谜底毛病!");printf("\n\n");}}printf("****得分情况****\n");printf("最后的得分为:%d\n",mark);if(mark>=90)printf("Very Good!\n");else if(mark>=60)printf("成果不错.\n");else printf("很遗憾成果不及格!\n");printf("\n");RecMark(Mark,count);Mark[count]=mark;count++;//记录次数递增printf("是否继续做练习?('y'—是,'n'—否):"); g=getchar();fflush(stdin);printf("\n");if(count>=20)//超越最年夜记录次数清0count=0;}while(g=='y');RecMark(Mark,count);return count;return_confirm();}void Look_Mark(int count){//printf("是否检查历史得分?('y'—是,'n'—否):");int *Mark;int i;Mark=(int *)malloc(20*sizeof(int));system("cls");printf("****查询历史得分情况****\n");LookMark(Mark,count);for(i=0;i<count;i++)printf("****第%d次得%d分****\n", i+1, Mark[i]);if(i>1){if(Mark[i-1]>60||Mark[i-2]>60){if(Mark[i-1]>Mark[i-2])printf("有进步,还要加油哦.\n");else if(Mark[i-1]==Mark[i-2]) printf("成果还可以,但没有进步,还要多多努力呀!\n");else printf("成果有点下降,要多多练习,不要气馁!!\n");}else printf("成果很欠好!要更加努力学习!\n");}else{if(Mark[0]>=90)printf("Very Good!\n");else if(Mark[0]>=60)printf("成果不错.\n");else printf("很遗憾成果不及格!\n"); }return_confirm();}void main(){int m=0;int *RN;char ch;RN=(int *)malloc(1*sizeof(int));RN[0]=0;printf("***如果是第一次运行***\n"); printf("**请先建立 n_rec.txt**\n");printf("*****否则会犯错 !*****\n"); printf("('y'--创立**'n'--不建)\n");ch=getchar();if(ch=='y')RecN(RN,1);LookN(RN,1);RN[0]+=m;fflush(stdin);printf("是否向试题库中添加试题: "); printf("('y'--是,'n'--否)?\n");ch=getchar();if(ch=='y')Built_shitiKu();menu: page_title("把持选单");printf("请用数字键选择把持\n\n"); printf("1 开始练习\n");printf("2 检查得分记录\n");printf("0 退出\n");printf("******************\n");RN[0]+=m;m=0;switch(getch()){case '1' : m=excersice_begin();break;case '2' : Look_Mark(RN[0]);break;case '0' : {RecN(RN,1);exit(0);}}system("cls");goto menu;}3.3法式运行结果(拷屏)4.课程设计心得、存在问题及解决方法连续两个星期的课程设计做完了,感觉自己的能力获得了年夜年夜的提高.刚开始看见题目的时候,很不以为然,觉得这么简单.但当自己开始着手做的时候才发现其实不是那么回事.一个看似简单的问题,有时候却牵扯甚多.经过两个星期的上机实践学习,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不竭的上机把持才华更好地学习它,通过实践,我也发现我的好多缺乏之处,对C语言学习平时只是马马虎虎的过去了,真正自己去解决实际问题的时候才会发现自己学的何等糟糕,通过课程设计对自己的编程能力也有所提高;再有对C语言的文件把持这一块,真的是难了我好久.还有对函数调用的正确使用不够熟悉,还有对C语言中经常呈现的毛病也不了解,通过实践,使我在这几个方面的认识有所提高.通过实践的学习,我认到学好计算机要重视实践把持,不单仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注重实践把持能力的培养,无论学习什么,亲自入手去做了才华获得最深刻的体会.。

栈设计:表达式求值设计

栈设计:表达式求值设计

数据结构课程设计报告栈的应用:表达式求值的设计目录1设计内容.................................................................................... 错误!未指定书签。

2设计分析.................................................................................. 错误!未指定书签。

2.1后缀表达式设计 .................................................................. 错误!未指定书签。

2.2中缀到后缀的转换设计 ....................................................... 错误!未指定书签。

3设计实践 .................................................................................. 错误!未指定书签。

3.1实现要求 ............................................................................... 错误!未指定书签。

3.2中缀表达式求值 .................................................................. 错误!未指定书签。

3.3后缀表达式求值 .................................................................. 错误!未指定书签。

3.4 中缀表达式转换成后缀表达式 ......................................... 错误!未指定书签。

数据结构课程设计--表达式求值问题

数据结构课程设计--表达式求值问题

课程设计(论文)题目名称表达式求值问题课程名称数据结构课程设计学生姓名 XXX学号xxxxxxxxx系、专业信息工程系、信息工程类指导教师 xxxxxx2010年 1 月 3 日目录1 问题描述 (2)2 需求分析 (2)3 概要设计 (2)3.1抽象数据类型定义 (2)3.2模块划分 (3)4 详细设计 (4)4.1数据类型的定义 (4)4.2主要模块的算法描述 (4)5 测试分析 (7)5.1程序运行结果 (7)5.2程序调试与体会 (8)6 课程设计总结 (8)参考文献 (8)附录(源程序清单) (9)1 问题描述编写一个表达式求值程序,使输入一个四则运算表达式后,能够返回正确的结果。

该表达式由数字0~9、+、-、*、/、括号组成,且表达式必须正确无误。

程序的编写可用到栈或队列的基本算法,求出该表达式的值,并分析算法的时间复杂度和运算的结果。

2 需求分析(1)为实现算符优先算法,可以使用两个工作栈。

一个称做OPTR,用以寄存运算符;另一个称做OPND;用以寄存操作数或运算结果。

算法的基本思想是:①首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素;②依次读入表达式中每个字符,若是操作数则OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较优先权后做相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为"#")。

(2)该程序实现表达式的求值问题:从键盘读入一个合法的算术表达式,利用算符优先关系,实现对算术四则混合运算的求值,输出正确的结果。

3 概要设计3.1抽象数据类型定义设定栈抽象数据类型的定义采用两个栈的入栈与出栈的操作来进行“运算符和操作数的配对”。

程序中主要用到以下抽象数据类型:1)ADT Stack {数据对象:D={ ai | ai∈ElemSet, i=2,...,n,n≥0 }数据关系:R1={ <ai-1, ai >| ai-1, ai∈D, i=2,...,n }约定an端为栈顶,a1端为栈底。

(完整word版)利用栈求表达式的值

(完整word版)利用栈求表达式的值

数据结构课程设计姓名:王宗敏班级:软件1021111217班学号:1021111217目录:1.需求分析……………………………2.概要设计……………………………3.详细设计……………………………4.调试分析……………………………5.用户使用说明………………………6.测试结果……………………………利用栈求表达式的值,可供小学生作业,并能给出分数。

1.需求分析任务:通过此系统可以实现如下功能:此系统能够输入一个表达式,并计算该表达式的值。

可以根据计算结果给出分数。

能供小学生进行简单的四则运算,此外这里特别强调括号的匹配!要求:根据以上功能说明,设计运算信息,堆栈的存储结构,设计程序完成功能;2. 概要设计在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义)。

3.详细代码#include "string.h"#include ”stdio.h”#include”conio.h"#define maxsize 100#include ”ctype.h"typedef char datatype;typedef struct{datatype stack[maxsize];int top;} seqstack;void stackinitiate(seqstack *s){s—>top=0;}int stacknotempty(seqstack s){if(s.top<=0)return 0;else return 1;}int stackpush(seqstack *s,datatype x) {if(s->top>=maxsize){printf(”堆栈已满无法插入!\n");return 0;}else{s—>stack[s—〉top]=x;s->top++;return 1;}}int stackpop(seqstack *s,datatype *d){if(s->top<=0){printf("堆栈已空无数据元素出栈!\n");return 0;}else{s-〉top——;*d=s->stack[s—〉top];return 1;}}int stacktop(seqstack s,datatype *d){if(s。

利用栈求表达式的值,可供小学生作业,并能给出分数

利用栈求表达式的值,可供小学生作业,并能给出分数

//1.h#include<ctime>#include<cstring>#include<fstream>#include<iomanip>#include<iostream>using namespace std;//template<class T>struct Ti //定义一个结构体,用于存储题习题库中的每一道台?题目{char chh[30];};template<class T>struct Stack //定义栈,其中数据元素为字符型í{T data[50];int top;};template<class T>struct Stack2 //定义栈,其中数据元素为整型í{float data[50];int top;};template<class T>class link{public:void Push(Stack<T> &S,char x);char Pop(Stack<T> &S,char x);void Push2(Stack2<T> &S,float x);float Pop2(Stack2<T> &S,float x);void pingjia(int m) ;int In(char c);int change(char x);int Precede(int a,int b);float Operate(float a,char c,float b);void toEmpty(char s[],int n);void isStay(char s1[],int n1,char s2[],int n2);int isInt(char s[],int n);void xitiku(char a[],int n);float Expression();Stack<T> setStack();Stack2<T> setStack2();};//1.cpp#include<ctime>#include"1.h"#include<cstring>#include<fstream>#include<iomanip>#include<iostream>using namespace std;template<class T>void link<T>::Push(Stack<T> &S,char x) {if(S.top==49){cout<<"栈已满!?"<<endl;}elseS.top++;S.data[S.top]=x;}template<class T>char link<T>:: Pop(Stack<T> &S,char x) {if(S.top==-1){cout<<"栈空!"<<endl;}x=S.data[S.top];S.top--;return x;template<class T>void link<T>::Push2(Stack2<T> &S,float x) {if(S.top==49){cout<<"栈已满!"<<endl;}elseS.top++;S.data[S.top]=x;}template<class T>float link<T>::Pop2(Stack2<T> &S,float x) {if(S.top==-1){cout<<"栈空!"<<endl;}x=S.data[S.top];S.top--;return x;template<class T>void link<T>::pingjia(int m){switch(m/10){case 0:case 1:case 2:case 3:case 4:case 5:cout<<"对不起,你没能及格,要加油哦!\n";break;case 6:case 7:cout<<"恭喜您及格了,但离高分还有距离哦!\n";break;case 8:case 9:cout<<"哇,您居然得了这么高的分数,真棒!\n";break;case 10:cout<<"OH MY GOD!,您竟然考了满分!!\n";break;}}template<class T>int link<T>::In(char c) //判断字符是否为运算符? {int m=0,i;char OP[7]={'+','-','*','/','(',')','#'};for(i=0;i<7;i++){if(c==OP[i])m++;}if(m==0)return 0;elsereturn 1;}template<class T>int link<T>::change(char x) //将运算符转换成为数字{int a;switch(x){case'+': a=0;break;case'-': a=1;break;case'*': a=2;break;case'/': a=3;break;case'(': a=4;break;case')': a=5;break;case'#': a=6;break;}return a;}template<class T>int link<T>:: Precede(int a,int b) //比括较运算符之间的优先级{int A;int token[7][7]={{1,1,-1,-1,-1,1,1},{1,1,-1,-1,-1,1,1},{1,1,1,1,-1,1,1},{1,1,1,1,-1,1,1},{-1,-1,-1,-1,-1,0,2},{1,1,1,1,2,1,1},{-1,-1,-1,-1,-1,2,0}};switch(token[a][b]){case -1:A=-1;break;case 0:A= 0;break;case 1:A= 1;break;}return A;}template<class T>float link<T>::Operate(float a,char c,float b) //对两个数进行四则运算{float s;switch(c){case'+':s=a+b;break;case'-':s=a-b;break;case'*':s=a*b;break;case'/':s=a/b;break;}return s;}template<class T>void link<T>::toEmpty(char s[],int n) //把一个数组置空{int i;for(i=0;i<n;i++)s[i]='\0';}template<class T>void link<T>::isStay(char s1[],int n1,char s2[],int n2) //把一个表达式分成几段{int i=0,j=0;while(s1[i]==' '){if(s1[i]==' '){i++;}}if(s1[i]=='\0')exit(0);while(s1[i]!='\0'){if(In(s1[i+1])!=In(s1[i])||In(s1[i+1])*In(s1[i])==1||s1[i]=='\0 '){s2[j]=s1[i];s1[i]=' ';break;}if(In(s1[i+1])==In(s1[i])){s2[j]=s1[i];s1[i]=' ';i++;j++;}}}template<class T>int link<T>::isInt(char s[],int n){int i=0,j=0,x;while(s[i]!=' '&&s[i]!='\0'){if(s[i]>='0'&&s[i]<='9'||s[0]=='-') j++;i++;}if(i==j){x=atoi(s);return x;}elsereturn -1;}template<class T>void link<T>::xitiku(char a[],int n) //创建习题库{int TIME,T;Ti t[100]={'\0'};char ch[30]={'\0'};int i;ifstream file("TextFile1.txt",ios_base::in);if(!file){cout<<"打洙?开a习°题琣库a文?件t失骸?败悒?!?"<<endl;exit(0);}i=0;while(!file.eof()){file.getline(ch,50);strcpy(t[i].chh,ch);i++;}srand(time(0));TIME=rand()%7;T=TIME;int j=0;while(t[T].chh[j]!='#'){cout<<t[T].chh[j];j++;}cout<<'=';strcpy(a,t[T].chh);file.close();}template<class T>float link<T>::Expression() //试题测试{char x=0,theta=0;char s[30]={'\0'},shu[5]={'\0'};float a=0,b=0,n;int i,j;Stack<T> R;Stack2<T> D;R=setStack();Push(R,'#');D=setStack2();xitiku(s,30);isStay(s,30,shu,5);while((shu[0]!='#'||R.data[R.top]!='#')) {if(In(shu[0])==0){float S1=atoi(shu);Push2(D,S1);toEmpty(shu,5);isStay(s,30,shu,5);}else{i=change(R.data[R.top]);j=change(shu[0]);switch(Precede(i,j)){case -1:Push(R,shu[0]);toEmpty(shu,5);isStay(s,30,shu,5);break;case 0:Pop(R,x);toEmpty(shu,5);isStay(s,30,shu,5);break;case 1:theta=Pop(R,theta);b=Pop2(D,b);a=Pop2(D,a);n=Operate(a,theta,b);Push2(D,n);break;}}}return n;}template<class T>Stack2<T> link<T>::setStack2() {Stack2<T> s;s.top=-1;return s;}template<class T>Stack<T> link<T>::setStack() {Stack<T> s;s.top=-1;return s;}//main.cpp#include"1.cpp"#include"iostream"using namespace std;int main(){link <int> t;cout<<"---------------------------------表达式求值-------------------------------------\n";int i=0,j,geshu=0,n,m,jieguo[100],daan[100];char ch,c[6]={'\0'};cout<<"***做题请输入A,查看成绩单请输入B,结束程序请输入C***\n\n";cin>>ch;cout<<endl;while(ch){switch(ch){case'A':cout<<"-------------现在开始做题--------------\n\n";n=int(t.Expression()+0.5);cout<<"\n\n请输入你的答案?输入-1表示停止做题:";cin>>c;m=t.isInt(c,6);while(m!=-1){if(m==-1111){cout<<"\n输入错误,请重新输入您的答案!";cout<<"\n\n请输入你的答案(输入-1表示停止做题):";cin>>c;m=t.isInt(c,6);}else{i++;jieguo[i-1]=m;daan[i-1]=n;if(m==n)geshu++;cout<<endl;n=int(t.Expression()+0.5);cout<<"\n\n请输入你的答鋏案(输入-1表示停止做题):";cin>>c;m=t.isInt(c,6);}}cout<<"----------------------------------------\n\n";break;case'B':if(i==0)cout<<"成绩单为空!\n\n";else{cout<<" *********您的成绩单******* \n\n";cout<<"-----------------------------------\n";cout<<"题号你的答案正确答案结论\n";for(j=0;j<i;j++){cout<<setw(2)<<j+1;cout<<setw(11)<<jieguo[j];cout<<setw(11)<<daan[j];if(jieguo[j]==daan[j])cout<<setw(11)<<"正确!";elsecout<<setw(11)<<"错误!";cout<<endl;}cout<<"-----------------------------------\n";cout<<"共做了"<<i<<"道题,其中\n";cout<<"做对了"<<geshu<<"道题,做错了"<<i-geshu<<"道题.\n";int fenshu=geshu*100/i;cout<<"最后成绩为:"<<fenshu<<"分!"<<endl;t.pingjia(fenshu);cout<<"-----------------------------------\n";}break;case'C':cout<<"程序结束,谢谢使用!"<<endl;exit(0);default:cout<<"输入错误,请重新输入!"<<endl;break;}cout<<"\n***做题请输入A,查看历史请输入B,结束程序请输入C***\n\n";cin>>ch;cout<<endl;ch=toupper(ch);}system("pause");return 0;}。

数据结构~栈和队列的应用_表达式的求值

数据结构~栈和队列的应用_表达式的求值

2011-2012学年第一学期数据结构课内实验报告实验名:栈和队列的应用:表达式的求值姓名:学号:班级:指导老师:日期:实验题目:1、实验目的:通过此实验进一步理解栈和队列,提高运用理论解决实际问题的能力。

2、实验内容:例如,输入9-(2+4*7)/5+3# ,并按回车键,即可输出结果如下:表达式的运算结果是:6表达式的后缀表达式为:9 2 4 7 * +5/-3+3、数据结构及算法思想:表达式计算是实现程序设计逻辑语言的基本问题之一,也是栈和队列应用的一个典型的例子。

该设计是先通过栈将中缀表达式转换为后缀表达式,在转换过程中又用到了队列的操作。

而在得到后缀表达式之后,又用到队列的操作对生成的后缀表达式进行计算。

在整个设计的实现过程中,用到的都是栈和队列的概念。

4、模块化分:本程序分为2个模块:(1)中缀表达式转换为后缀表达式;(2)求后缀表达式5、详细设计及运行结果:(1)中缀表达式转换为后缀表达式void CTPostExp(SeqQueue *Q){SeqStack S; //运算符栈char c,t;InitStack(&S); //初始化栈Push(&S,'#'); //压入栈底元素‘#’do { //扫描中缀表达式c=getchar();switch(c){case ' ':break; //去除空格符case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9': EnQueue(Q,c);break;case '(':Push(&S,c);break;case ')':case '#':do{t=Pop(&S);if(t!='('&&t!='#') EnQueue(Q,t);}while(t!='('&&S.top !=-1);break;case '+':case '-':case '*':case '/':while(Priority(c)<=Priority(GetTop(S))){t=Pop(&S);EnQueue(Q,t);}Push(&S,c);break;}}while(c!='#'); //以'#'号结束表达式扫描}(2)后缀表达式的计算DataType CPostExp(SeqQueue Q) {SeqStack S;char ch;int x,y;InitStack(&S);while(!QueueEmpty(Q)){ch=DeQueue(&Q);if(ch>='0' &&ch<='9')Push(&S,ch);else{y=Pop(&S)-'0';x=Pop(&S)-'0';switch(ch){case '+':Push(&S,(char)(x+y+'0'));break;case '-':Push(&S,(char)(x-y+'0'));break;case '*':Push(&S,(char)(x*y+'0'));break;case '/':Push(&S,(char)(x/y+'0'));break;}}}return GetTop(S);}输入9-(2+4*7)/5+3# ,并按回车键,输出:表达式的运算结果是:6表达式的后缀表达式为:9 2 4 7 * +5/-36、调试情况,设计技巧及体会:表达式是由运算对象、运算符、括号组成的有意义的式子。

利用栈求表达式课程设计报告

利用栈求表达式课程设计报告

《数据结构》课程设计报告专业计算机科学与技术班级(1)姓名王昕学号20101308003指导教师顾韵华起止时间2011.10~2011.12课程设计:利用栈求表达式的值一、任务描述建立试题库文件,随机产生n个题目;题目涉及加减乘除,带括号的整数混合运算;随时可以退出;保留历史分数,能回顾历史,给出与历史分数比较后的评价。

(假设这是一个可供小学生练习算术运算的小系统)要求:根据以上任务说明,设计程序完成功能。

二、问题分析1、功能分析分析设计课题的要求,要求编程实现以下功能:(1)建立试题库文件—即创建试题库函数(2)实现整数混合运算—即建立栈实现运算(3)查看历史分数—即建立函数查看2、数据对象分析由于其中涉及了能回顾历史成绩以及随机做题等问题,所以就考虑用到了文件的打开与关闭以及文件的读写功能。

由于此设计要实现多个功能,所以为了源代码清晰明了,所有的函数不是用的嵌套方式,而是对每个功能都用一个子程序来实现,然后通过对子程序的调用来达到设计的要求三、数据结构设计有关的定义如下:typedef struct shiti /*定义表达式*/{char a[20]; /*存放表达式*/long result; /*存放用户输入的答案*/}xuanti;typedef struct SqStack1 /*建立数字栈*/{int *base;int *top;int stacksize;}SqStack1;typedef struct SqStack2 /*建立运算符栈*/{char *base;char *top;int stacksize;}SqStack2;四、功能设计(一)主控菜单设计为实现程序的操作功能,首先设计一个含有多个菜单项的主控菜单程序,然后再为这些菜单项配上相应的功能。

程序运行后,给出以下项的内容和输入提示,如下:1.输入表达式2.表达式结果3.继续输入表达式4.显示结果(二)程序模块结构由课题要求可将程序划分为以下几个模块(即实现程序功能所需的函数):1.写入函数WriteToFile()2.读出函数ReadFromFile()3.栈函数stack()(三)函数调用关系其中main()是主函数,它进行菜单驱动,根据选择项0~9用相应的函数。

数据结构课程设计报告-表达式求值

数据结构课程设计报告-表达式求值
OPTR->top--;
}
double Calculate(double a,double b,char c){ //进行二元运算
double result;
switch(c){
case '+':result=a+b;break;
case '-':result=a-b;break;
case '*':result=a*b;break;
void PushNum(OPND *OPND,double num){ //操作数进栈
OPND->top++;
OPND->array[OPND->top-1]=num;
}
void PopNum(OPND *OPND,double *num){ //操作数出栈
*num=OPND->array[OPND->top-1];
default:priority='E';
}
return priority;
}
void Process(OPND *OPND,OPTR *OPTR,char x){ //计算表达式
double a,b;char c;
static double tempnum=0.00000000;
static int len=10; //用于各数位上的值的转换
double array[N];
int top;//栈顶指针
}OPND;
typedef struct{ //定义运算符栈
char array[N];
int top;//栈顶指针
}OPTR;
int Cint(char mychar){ //将字符0-9转换成数值

数据结构_栈的基本操作及其应用__课程设计__实验报告

数据结构_栈的基本操作及其应用__课程设计__实验报告

2
第三章
实验设计的主要内容有:
实验设计内容
1.首先要知道什么是栈。栈是限制仅在表的一端进行插入和删除运算的线性表,通常称插入 删除的这一端为栈顶(Top) ,另一端为栈底(Bottom) 。当表中没有元素时称为空栈。 2.了解栈的两种存储结构。即顺序存储和链式存储。 (1)顺序栈。栈的顺序存储结构称为顺序栈,是利用一组地址连续的存储单元依次存放自 栈底到栈顶的数据元素,同时附设指针 top 指向栈顶元素在顺序栈的位置。通过顺序栈的位 置。通过顺序栈的实现进而对栈进行栈的基本操作。 (2)链式栈。栈的链式存储结构称为链式栈, 3..学会使用栈的几种基本运算。栈的基本运算有五种,即:置空栈、判栈空、进栈、出栈、 取栈顶元素。栈的这五种运算都是要在顺序表中进行的。 4.函数的实现。 在此次课程设计当中需要用到很多的函数。如:建空栈、判栈空、进栈、出栈、取栈顶元素 等函数的定义和使用。 在制转换和字符串中心对称判断过程中的使用的一些函数, 主函数的 使用, 即主函数中调用前面的一些函数, 还有在整个算法实现的过程中用到的一些循环语句 和选择语句。 5.程序编码完成以后要进行运行、编译和调试。 6.最后写出一篇课程设计的实验报告。
刘磊 2012 年 12 月 18 日


第一章 需求分析.......................................................................................................................1 1.1 栈的定义及基本运算..........................................................................................................1 1.2 栈的两种存储结构..............................................................................................................1 1.3 栈的基本应用.....................................................................................................................1 第二章 实验要求...............................................................................................................................2 第三章 实验设计内容...............................................................................................................3 第四章 概要设计.......................................................................................................................4 第五章 详细设计.......................................................................................................................7 1.1 置空栈..................................................................................................................................7 1.2 判断栈空..............................................................................................................................7 1.3 进栈......................................................................................................................................8 1.4 出栈......................................................................................................................................8 1.5 取栈顶元素..........................................................................................................................8 第六章 运行结果分析.............................................................................................................9 第七章 实验总结与心得体会...................................................................................................11 参考文献........................................................................................................................................... 11 附录(源代码)...............................................................................................................................12

课程设计之利用栈求值

课程设计之利用栈求值

课程设计之利用栈求值一、教学目标本节课的学习目标为:知识目标:学生需要掌握栈的基本概念,了解栈的性质和用途,理解栈的操作原理。

技能目标:学生能够运用栈解决基本的计算问题,例如逆波兰表达式的求值。

情感态度价值观目标:通过解决实际问题,激发学生对计算机科学的兴趣,培养学生的逻辑思维能力和创新精神。

二、教学内容本节课的教学内容主要包括:1.栈的定义和性质:介绍栈的基本概念,解释栈的先进后出(FILO)特性。

2.栈的操作:讲解栈的压入(push)和弹出(pop)操作,以及栈的遍历。

3.逆波兰表达式:介绍逆波兰表达式的概念,解释其与栈的关系。

4.利用栈求值:引导学生运用栈来求解逆波兰表达式,培养学生的实际操作能力。

三、教学方法为了提高教学效果,本节课将采用以下教学方法:1.讲授法:讲解栈的基本概念、性质和操作。

2.案例分析法:通过分析具体的逆波兰表达式求值实例,引导学生掌握利用栈解决问题的一般方法。

3.实验法:安排课堂练习,让学生亲自动手操作,验证所学知识。

4.讨论法:学生进行小组讨论,分享学习心得,互相解答疑问。

四、教学资源为了支持教学内容的传授和教学方法的实施,我们将准备以下教学资源:1.教材:提供相关章节,为学生提供理论知识的学习依据。

2.多媒体资料:制作课件,以图文并茂的形式展示栈的概念和操作。

3.实验设备:提供计算机及相关设备,让学生进行课堂练习。

4.在线资源:推荐相关的学习和论坛,方便学生课后自主学习和交流。

五、教学评估本节课的评估方式包括:1.平时表现:观察学生在课堂上的参与程度、提问回答等情况,了解学生的学习态度和理解程度。

2.作业:布置相关的练习题,评估学生对栈知识掌握的情况。

3.考试:安排一次课堂小测,测试学生对逆波兰表达式求值的掌握程度。

评估方式应客观、公正,能够全面反映学生的学习成果。

通过评估,教师可以了解学生的学习情况,及时进行教学调整。

六、教学安排本节课的教学安排如下:1.进度:按照教材的章节顺序,逐步讲解栈的知识点和逆波兰表达式的求值方法。

【数据结构】用栈解决表达式求值问题

【数据结构】用栈解决表达式求值问题

【数据结构】⽤栈解决表达式求值问题题⽬:求4+4/2-9*3的值;思路: ①:⽤⼀个字符型数组存放了表达式《4+4/2-9*3》;1char val[9] = {'4','+','4','/','2','-','9','*','3'}; ②:定义两个栈,⼀个存放数字,⼀个存放符号;1//定义存储整型的栈2 typedef struct node3 {4int data[MAXSIZE];5int top;6 }SeqStack;7//定义存储字符型的栈8 typedef struct nodeb9 {10char data[MAXSIZE];11int top;12 }SeqStackchar; ③:定义符号的优先级;1//获取优先级2int youxianquan(char c)3 {4int x;5switch(c)6 {7case'-':8case'+':9 x = 1;10break;11case'*':12case'/':13 x = 2;14break;15default: printf("error");16 }17return(x);18 } ④:确定运算思路——⾃左扫描表达式的每⼀个字符时,若当前字符是运算数值,⼊整型栈。

是运算符时,若这个运算符⽐栈顶运算符⾼则⼊栈,继续向后处理,若这个运算符⽐栈顶运算符低,则从对象栈出栈两个运算量,从运算符栈出栈⼀个运算符进⾏运算,将其运算结果⼊对象栈。

然后继续判断当前字符串是否⾼于栈顶运算符,如果⽐栈顶运算符⾼,则⼊栈,否则则继续运算。

1//表达式求值2int result(SeqStack *a, SeqStackchar *b)3 {4char val[9] = {'4','+','4','/','2','-','9','*','3'}; //创建表达式5int i,resultval;6int x,y;7char c;8int n = sizeof(val);9for(i = 0; i < n; i++)10 {11 c = val[i]; //获取表达式第i个值12if(i%2 == 0) //把数字和符号区分开来,13 {14 a->top++;15 a->data[a->top] = c - '0'; //存放数值的16 }17else//存放符号的18 {19if(b->top == -1) //如果b为空则直接存⼊符号20 {21 b->top++;22 b->data[b->top] = c;23 }24else25 {26 x = youxianquan(c); //求出当前符号的优先级27 y = youxianquan(b->data[b->top]); //求b栈顶的符号优先级28if(x > y) //如果当前优先级⼤于栈顶优先级,则进栈29 {30 b->top++;31 b->data[b->top] = c;32 }33else34 {35 resultval = abyunsuan(a,b); //否则a的前两个出栈,b的栈顶出栈,然后进⾏运算,运算结果再进栈a;36 y = youxianquan(b->data[b->top]); //继续判断表达式第i个值的优先级是否⼤于栈顶符号的优先级37if(x > y) //如果当前优先级⼤于栈顶优先级,则进栈38 {39 b->top++;40 b->data[b->top] = c;41 }42else//否则重复上⾯的操作对a的前两个出栈值和b的栈顶出栈并且运算43 {44 resultval = abyunsuan(a,b);45//由于每次循环都会对b的栈顶符号的优先级做对⽐,所以优先级的对⽐只做⼀次即可46 b->top++; //把当前的符号进b栈47 b->data[b->top] = c;48 }49 }50 }51 }52while(i == n - 1 && a->top != -1 && b->top != -1) //当运算符输⼊完时53 {54 resultval = abyunsuan(a,b);55 }56 }57return resultval;58 }1//a出栈两个值 b出栈栈顶运算符,进⾏运算2int abyunsuan(SeqStack *a, SeqStackchar *b)3 {4int fir,sec,resultval;5char topchar;6 fir = a->data[a->top];7 a->top--;8 sec = a->data[a->top];9 a->top--;10 topchar = b->data[b->top]; //b的栈顶出栈11 b->top--;12 resultval = yunsuan(sec,fir,topchar);13 a->top++;14 a->data[a->top] = resultval;15return(resultval);16 }全部代码如下:1 #include<stdio.h>2 #include<stdlib.h>3 #include<string.h>45#define MAXSIZE 102467//定义存储整型的栈8 typedef struct node9 {10int data[MAXSIZE];11int top;12 }SeqStack;13//定义存储字符型的栈14 typedef struct nodeb15 {16char data[MAXSIZE];17int top;18 }SeqStackchar;1920//创建整型栈21 SeqStack *creat_sa()22 {23 SeqStack *s;24 s = (SeqStack *)malloc(sizeof(SeqStack));25 s->top = -1;26return(s);27 }28//创建字符串栈29 SeqStackchar *creat_sb()30 {31 SeqStackchar *s;32 s = (SeqStackchar *)malloc(sizeof(SeqStackchar));33 s->top = -1;34return(s);35 }3637//函数声明38int youxianquan(char c);39int yunsuan(int a, int b, char c);40int result(SeqStack *a, SeqStackchar *b);41int abyunsuan(SeqStack *a, SeqStackchar *b);4243//获取优先级44int youxianquan(char c)45 {46int x;47switch(c)48 {49case'-':50case'+':51 x = 1;52break;53case'*':54case'/':55 x = 2;56break;57default: printf("error");58 }59return(x);60 }6162//开始运算63int yunsuan(int a, int b, char c)64 {65int result;66switch(c)67 {68case'*':69 result = a * b;70break;71case'/':72 result = a / b;73break;74case'+':75 result = a + b;76break;77case'-':78 result = a - b;79break;80 }81return(result);82 }8384//a出栈两个值 b出栈栈顶运算符,进⾏运算85int abyunsuan(SeqStack *a, SeqStackchar *b)86 {87int fir,sec,resultval;88char topchar;89 fir = a->data[a->top];90 a->top--;91 sec = a->data[a->top];92 a->top--;93 topchar = b->data[b->top]; //b的栈顶出栈94 b->top--;95 resultval = yunsuan(sec,fir,topchar);96 a->top++;97 a->data[a->top] = resultval;98return(resultval);99 }100101//表达式求值102int result(SeqStack *a, SeqStackchar *b)103 {104char val[9] = {'4','+','4','/','2','-','9','*','3'}; //创建表达式105int i,resultval;106int x,y;107char c;108int n = sizeof(val);109for(i = 0; i < n; i++)110 {111 c = val[i]; //获取表达式第i个值112if(i%2 == 0) //把数字和符号区分开来,113 {114 a->top++;115 a->data[a->top] = c - '0'; //存放数值的116 }117else//存放符号的118 {119if(b->top == -1) //如果b为空则直接存⼊符号120 {121 b->top++;122 b->data[b->top] = c;123 }124else125 {126 x = youxianquan(c); //求出当前符号的优先级127 y = youxianquan(b->data[b->top]); //求b栈顶的符号优先级128if(x > y) //如果当前优先级⼤于栈顶优先级,则进栈129 {130 b->top++;131 b->data[b->top] = c;132 }133else134 {135 resultval = abyunsuan(a,b); //否则a的前两个出栈,b的栈顶出栈,然后进⾏运算,运算结果再进栈a;136 b->top++;137 b->data[b->top] = c;138 }139 }140 }141while(i == n - 1 && a->top != -1 && b->top != -1) //当运算符输⼊完时即当所有的字符全部输⼊完时才执⾏此循环142 {143 resultval = abyunsuan(a,b);144 }145 } //也可以把上⾯的⼀个while循环注释掉,然后加上下⾯的循环; /* while(a=>top != -1 && b->top != -1) resultval = abyunsuan(a,b); */146return resultval;147 }148149void main()150 {151 SeqStack *a;152 SeqStackchar *b;153int resultval;154 a = creat_sa(); //创建链表a155 b = creat_sb(); //创建链表b156 resultval = result(a,b);157 printf("%d",resultval);158159 }。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

湖南工学院数据结构课程设计报告
班级
学号:
姓名:
目录
1需求分析 (3)
1.1问题的提出 (3)
1.2任务与分析 (3)
2 程序运行平台 (3)
3 概要设计 (4)
3.1主要技术线路............................................................................................................ 错误!未定义书签。

3.2程序运行结构图 (4)
4 详细设计 (4)
4.1详细设计思想 (4)
4.2 本程序定义的数据结构 (5)
4.3程序运行原理图 (6)
4.4测试模块 (6)
4.5历史成绩查询模块 (7)
4.6主函数与菜单函数模块 (8)
5 调试分析 (9)
6 测试结果 (10)
7 结论 (14)
8附录 (20)
摘要
设计题目:利用栈求表达式的值,可供小学生作业,并能给出分数
主要内容:设计一个小学生自测程序,能输入一个表达式后,由学生输入结果,再与正确答案对比。

1需求分析
1.1 输入形式,数值范围
直接输入数学表达式,回车。

本程序可以使用0到9以及加减乘除等运算符包括()。

1.2 任务与分析
建立试题库文件,随机产生n个题目;题目涉及加减乘除,带括弧的混合运算;随时可以退出;保留历史分数,能回顾历史,给出与历史分数比较后的评价
2 程序运行平台
Microsoft Visual C++ 6.0
具体操作如下:
1.源程序的编辑
在Visual C++ 6.0开发环境下编辑一个简单、完整的C++程序,这是开发各种软件必须进行的软件开发过程。

2.源程序的编译、连接与运行
在Visual C++ 6.0环境下,对任务1所编辑的C++源程序进行编译、连接和运行,观察程序的执行过程和个变量的值。

3.Debug调试功能
对任务1所完成的源程序设置若干断点,掌握Visual C++ 6.0环境下断点
的设置与取消方法,在Debug调试状态下,学习程序调试的各种相关方法,并通过Debug状态下的Variable窗口和Watch装口观察成粗的执行过程和结果。

3 概要设计
3.1程序运行结构图
4 详细设计
4.1详细设计思想
首先建立三个文件,分别为shujuku.txt,markrec.txt,n_rec.txt。

其中shujuku.txt中存放试题;markrec.txt存放历史分数;n_rec.txt存放总共测试次数。

①创建试题库模块:
首先在主函数中调用创建试题库函数,将试题存入到试题库文件shitiku.txt中,然后将该调用从主函数中删除。

创建试题库函数:创建指向xuanti类型的指针,利用循环将输入的测试题该
指针的xuanti单元中,最后将该指针中的测试题写入试题库文件shitiku.txt 中。

②试题测试模块:
试题计算:建立两个栈,分别存放数字、运算符,建立一个二维数组,存放任意两个运算符之间的优先级关系,通过比较符号栈中后两个运算符的优先级关系,决定数字栈中后两个数据是直接入栈还是运算之后入栈,最后在数字栈中得到最后的运算结果。

通过比较用户输入的结果与程序计算的结果来决定测试者的分数mark是否加分,测试完成时,将分数mark写入记录分数文件markrec.txt中,并将总共的测试次数记录如n_rec.txt中。

③查看历史分数模块:
通过查看n_rec.txt中总共的测试次数n,得到markrec.txt中n个历史分数,将结果显示个用户。

④随时退出模块:
测试完或将查看历史分数后,按任意键将返回到菜单,菜单中输入0即可退出。

4.2 本程序定义的数据结构
typedef struct shiti /*定义表达式*/
{
char a[20]; /*存放表达式*/
long result; /*存放用户输入的答案*/
}xuanti;
typedef struct SqStack1 /*建立数字栈*/
{
int *base;
int *top;
int stacksize;
}SqStack1;
typedef struct SqStack2 /*建立运算符栈*/ {
char *base;
char *top;
int stacksize;
}SqStack2;
4.3程序运行原理图
测试模块的流程图为图所示:
4.5 历史成绩查询模块
历史成绩查询模块的流程图为图所示:
4.6主函数与菜单函数模块
主函数与菜单函数模块的源代码为:
void main()
{
int m=0;
int *RN;
char ch;
RN=(int *)malloc(1*sizeof(int));
RN[0]=0;
system("cls"); /*清屏*/
LookN(RN,1);
RN[0]+=m;
fflush(stdin);
menu: page_title(); /*输出菜单*/
RN[0]+=m;
m=0;
switch(getch())
{
case '1' : m=excersice_begin();
break;
case '2' : Look_Mark(RN[0]);
break;
case '0' : {
RecN(RN,1);
exit(0);
}
}
system("cls");
goto menu;}
5 调试分析
本程序定义函数较多,调试时特别注意各个函数的调用。

处学会灵活的运用F10和F11的调试功能,就能达到事半功倍的效果。

6 测试结果
6.1 开始菜单
此时选择1直接开始测试,选择2则查看历史分数,选择0退出程序。

6.2 选择1 开始测试
举例如下:
填入答案221,结果如下:
接着进行完本次测试:
做完全部题目后得出得分,并有评价给出
6.3 此时选Y继续测试
选N则回到主菜单:
6.4 选择2查看历史得分及评价
本次测试结果检验了该程序的功能和效果
7 结论
对本程序的总结
自己掌握的只是不是很牢固,有很多的只是都是很模糊的,都很模棱两可的,对自己的只是不是有很大信心。

做完这个程序,发现设局结构有很多东西需要自己深入学习,翻阅资料很重要。

本次使用的工具主要是Microsoft Visual C++ 6.0
8附录。

源代码及程序见光盘。

相关文档
最新文档