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

数据结构课程设计可选题目一、课程设计的目的学习数据结构与算法的最终目的是解决实际的应用问题,特别是非数值计算类型的应用问题。
课程设计要求同学独立完成一个较为完整的应用需求分析,在完成设计和编程大型作业的过程中,深化对数据结构与算法课程中基本概念、理论和方法的理解;训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念;使同学的程序设计与调试水平有一个明显的提高。
二、数据结构课程设计可选题目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. 飞机订票系统任务:通过此系统可以实现如下功能:⑴录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)⑵查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);⑶可以输入起飞抵达城市,查询飞机航班情况;⑷订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;⑸退票:可退票,退票后修改相关数据文件;⑹客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
用栈求算术表达式的值

⽤栈求算术表达式的值题⽬:1 将中缀表达式转换为后缀表达式2 求后缀表达式的值#include<stdio.h>#define MaxSize 100struct{char data[MaxSize];int top; //栈顶指针}op; //定义运算符栈struct{float data[MaxSize];int top;}st; //定义数值栈void trans(char exp[],char postexp[]){int i = 0;int j = 0;char ch;op.top = -1; //栈顶指针初始化为-1ch = exp[i];i++;while (ch != '\0'){switch (ch){case '(': //判定为左括号直接⼊栈op.top++;op.data[op.top] = ch;break;case ')':while (op.data[op.top] != '('){postexp[j] = op.data[op.top];op.top--;j++;}op.top--; //左括号也出栈但不输出break;case '+':case '-'://为 + 或者 - 时候,优先级不⼤于栈顶任何运算符的优先级直到 )while (op.top != -1 && op.data[op.top] != '('){postexp[j] = op.data[op.top];j++;op.top--;}op.top++;op.data[op.top] = ch;break;case '*':case '/'://为 * 或者是 / 时,其优先级不⼤于栈顶为 * 或者为 /的优先级直到(while (op.top != -1 && op.data[op.top] != '('&& (op.data[op.top] == '*' || op.data[op.top] == '/')){//将栈顶运算符弹出并输出postexp[j] = op.data[op.top];j++;op.top--;}//该运算符的优先级⼤于栈顶运算符的优先级直接压栈op.top++;op.data[op.top] = ch;break;case ' ': //过滤掉空格break;default:while (ch >= '0' && ch <= '9') //判定为数字{postexp[j] = ch;j++;ch = exp[i];i--;postexp[j] = '#'; //⽤#标识⼀个数值串结束j++;break;}ch = exp[i];i++;}while (op.top != -1) //此时exp扫描完毕栈不空时出栈并存放到postexp {postexp[j] = op.data[op.top];j++;op.top--;}postexp[j] = '\0'; //添加结束标识符}//后缀表达式的求值过程float Compvalue(char postexp[]){char ch;float d;int i = 0;ch = postexp[i];i++;st.top = -1;while (ch != '\0'){switch (ch){case '+':st.data[st.top - 1] = st.data[st.top - 1] + st.data[st.top];st.top = st.top - 1;break;case '-':st.data[st.top - 1] = st.data[st.top - 1] - st.data[st.top];st.top = st.top - 1;break;case '*':st.data[st.top - 1] = st.data[st.top] * st.data[st.top - 1];st.top = st.top - 1;break;case '/':if (st.data[st.top] != 0){st.data[st.top - 1] = st.data[st.top - 1] / st.data[st.top];st.top = st.top - 1;}else{printf("除数为0.\n");return 0.0;}break;default:d = 0;while (ch >= '0' && ch <= '9'){d = d * 10 + ch - '0';ch = postexp[i];i++;}st.top++;st.data[st.top] = d;break;}ch = postexp[i];i++;}return st.data[st.top];}int main(){int i = 0;char exp[] = {"(2*2)*1+3*2/1"};char postexp[MaxSize];trans(exp,postexp);while (postexp[i] != '\0'){printf("%c",postexp[i]);printf("\n");printf("运算结果为:%f.\n", Compvalue(postexp));system("pause");return 0;}后缀表达式求值如下:while(从postexp中间读取字符ch,ch != '\0'){若ch为数字,将后继的所有数字构成⼀个整数存放到数值栈st中若ch为 "+",则从数值栈st中退栈两个运算数,相加后进栈st中若ch为 "-",则从数值栈st中退栈两个运算数,相减后进栈st中若ch为 "*",则从数值栈st中退栈两个运算数,相乘后进栈st中若ch为 "/",则从数值栈st中退栈两个运算数,相除后进栈st中(若除数为0,则提⽰错误) }运⾏结果参考资料:1 《新编数据结构习题与解析》。
利用栈求表达式的值,可供小学生作业,并能给出分数 数据结构课程设计说明书格式

中北大教之阳早格格创做数据结构 课程安排证明书籍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;return e2;}//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)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);}//************************************* 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");exit(0);}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{mark=0;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谈话,仍旧其余的谈话,以及其余的估计机圆里的知识皆要沉正在试验,所以来正在教习历程中,尔会越收注沉试验支配本领的培植,无论教习什么,亲自动脚来搞了才搞得到最深刻的体验.。
c语言栈计算表达式

c语言栈计算表达式在计算机科学中,栈是一种非常重要的数据结构,被广泛应用于编译器、操作系统、网络通信等领域。
在本文中,我们将探讨如何使用C语言实现栈来计算表达式。
表达式是由操作数、操作符和括号组成的数学式子,例如:3 + 4 * 2 / (1 - 5)。
在计算表达式时,我们需要遵循一定的计算规则,如乘除法优先于加减法,括号内的计算优先于括号外的计算等。
我们可以使用栈来实现对表达式的计算。
具体步骤如下:1. 定义两个栈:一个操作数栈和一个操作符栈。
2. 从左到右遍历表达式的每一个字符,如果是数字则将其压入操作数栈;如果是操作符则将其压入操作符栈,并根据运算规则进行计算。
3. 在遍历完成后,操作符栈中可能还有未计算的操作符,需要继续计算,直到操作符栈为空。
4. 最终操作数栈中只剩下一个数,即为表达式的计算结果。
下面是一段示例代码,用于计算简单的表达式:```#include <stdio.h>#include <stdlib.h>#include <ctype.h>#define MAX_SIZE 100typedef struct {int data[MAX_SIZE];int top;} Stack;void initStack(Stack *s) {s->top = -1;}void push(Stack *s, int item) { if (s->top == MAX_SIZE - 1) { printf('Stack Overflow');exit(1);}s->data[++s->top] = item;}int pop(Stack *s) {if (s->top == -1) {printf('Stack Underflow');exit(1);}return s->data[s->top--];}int isEmpty(Stack *s) {return s->top == -1;}int isFull(Stack *s) {return s->top == MAX_SIZE - 1;}int peek(Stack *s) {return s->data[s->top];}int evaluate(char *expr) {Stack operandStack, operatorStack; initStack(&operandStack);initStack(&operatorStack);int i = 0;while (expr[i] != '0') {if (isdigit(expr[i])) {int num = 0;while (isdigit(expr[i])) {num = num * 10 + (expr[i] - '0'); i++;}push(&operandStack, num);}else if (expr[i] == '(') {push(&operatorStack, expr[i]);i++;}else if (expr[i] == ')') {while (!isEmpty(&operatorStack) && peek(&operatorStack) != '(') {int op2 = pop(&operandStack);int op1 = pop(&operandStack);char op = pop(&operatorStack);int result;switch (op) {case '+':result = op1 + op2;break;case '-':result = op1 - op2;break;case '*':result = op1 * op2;break;case '/':result = op1 / op2;break;}push(&operandStack, result);}pop(&operatorStack);i++;}else if (expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/') {while (!isEmpty(&operatorStack) &&peek(&operatorStack) != '(' &&((expr[i] == '*' || expr[i] == '/') || (expr[i] == '+' || expr[i] == '-') &&(peek(&operatorStack) == '*' || peek(&operatorStack) == '/'))) {int op2 = pop(&operandStack);int op1 = pop(&operandStack);char op = pop(&operatorStack);int result;switch (op) {case '+':result = op1 + op2;break;case '-':result = op1 - op2;break;case '*':result = op1 * op2;break;case '/':result = op1 / op2;break;}push(&operandStack, result); }push(&operatorStack, expr[i]); i++;}else {i++;}}while (!isEmpty(&operatorStack)) { int op2 = pop(&operandStack);int op1 = pop(&operandStack);char op = pop(&operatorStack);int result;switch (op) {case '+':result = op1 + op2;break;case '-':result = op1 - op2;break;case '*':result = op1 * op2;break;case '/':result = op1 / op2;break;}push(&operandStack, result);}return pop(&operandStack);}int main() {char expr[MAX_SIZE];printf('Enter an expression: ');fgets(expr, MAX_SIZE, stdin);int result = evaluate(expr);printf('Result = %d', result);return 0;}```在这段代码中,我们定义了一个栈结构体,包含了栈的数据和栈顶指针。
《算法设计综合实训》题目讲解

算法设计综合实训题目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之间的一个整数。
(完整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。
利用栈来实现算术表达式求值的算法

利用栈来实现算术表达式求值的算法利用栈来实现算术表达式求值的算法算术表达式是指按照一定规则组成的运算式,包含数字、运算符和括号。
在计算机中,求解算术表达式是一项基本的数学运算任务。
根据算术表达式的性质,我们可以考虑利用栈这一数据结构来实现求值算法。
一、算法思路首先,我们需要明确一个重要概念——逆波兰表达式(ReversePolish notation)。
逆波兰表达式是一种没有括号的算术表达式,其运算规则是先计算后面的数字和运算符,再计算前面的数字和运算符。
例如,对于算术表达式“3+4*5-6”,其对应的逆波兰表达式为“3 45 * +6 -”。
那么,我们可以利用栈来实现将中缀表达式转化为逆波兰表达式的过程,具体步骤如下:1. 创建两个栈——操作数栈和操作符栈。
2. 从左到右扫描中缀表达式的每一个数字和运算符,遇到数字则压入操作数栈中,遇到运算符则进行如下操作:(1)如果操作符栈为空或当前运算符的优先级大于栈顶运算符的优先级,则将当前运算符压入操作符栈中。
(2)如果当前运算符的优先级小于或等于栈顶运算符的优先级,则将栈顶运算符弹出并加入操作数栈中,重复此过程直到遇到优先级较低的运算符或操作符栈为空为止,然后将当前运算符压入操作符栈中。
3. 扫描完中缀表达式后,若操作符栈不为空,则将其中所有运算符弹出并加入操作数栈中。
4. 最终,操作数栈中存放的就是逆波兰表达式,我们可以按照逆波兰表达式的计算规则来计算其结果。
二、算法优点利用栈来实现算术表达式求值的算法具有以下优点:1. 代码简洁易懂,易于实现和维护。
2. 由于将中缀表达式转化为逆波兰表达式后,可以减少运算符的优先级关系而消除括号,从而减少求值的复杂度,提高程序的执行效率。
三、代码实现下面是利用栈来实现算术表达式求值的算法的Python代码实现:```pythonclass Stack:def __init__(self):self.items = []def push(self, item):self.items.append(item)def pop(self):return self.items.pop()def peek(self):return self.items[-1]def is_empty(self):return len(self.items) == 0def size(self):return len(self.items)def calculate(op_num1, op_num2, operator):if operator == "+":return op_num1 + op_num2elif operator == "-":return op_num1 - op_num2elif operator == "*":return op_num1 * op_num2elif operator == "/":return op_num1 / op_num2def infix_to_postfix(infix_expr):opstack = Stack()postfix_expr = []prec = {"+": 1, "-": 1, "*": 2, "/": 2, "(": 0} token_list = infix_expr.split()for token in token_list:if token.isdigit():postfix_expr.append(token)elif token == '(':opstack.push(token)elif token == ')':top_token = opstack.pop()while top_token != '(':postfix_expr.append(top_token)top_token = opstack.pop()else:while (not opstack.is_empty()) and(prec[opstack.peek()] >= prec[token]):postfix_expr.append(opstack.pop())opstack.push(token)while not opstack.is_empty():postfix_expr.append(opstack.pop())return " ".join(postfix_expr)def postfix_eval(postfix_expr):opstack = Stack()token_list = postfix_expr.split()for token in token_list:if token.isdigit():opstack.push(int(token))else:op_num2 = opstack.pop()op_num1 = opstack.pop()result = calculate(op_num1, op_num2, token) opstack.push(result)return opstack.pop()infix_expr = "3 + 4 * 5 - 6"postfix_expr = infix_to_postfix(infix_expr)print(postfix_expr)print(postfix_eval(postfix_expr))```四、总结算术表达式求值是一项常见的数学运算任务,利用栈这一数据结构来实现求值算法是一种简单有效的方法,它将中缀表达式转化为逆波兰表达式后,可以消除括号并减少运算符的优先级关系,从而提高程序的执行效率。
利用栈求表达式的值,可供小学生作业,并能给出分数

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