栈的表达式求值 数据结构(C语言)优秀课程设计
C语言实现一.二叉树操作 二.用栈实现算术表达式求值 课设报告
沈阳理工大学课程设计专用纸
No. 1
题目 一.二叉树操作(1)二.算术表达式求
一、课程设计的目的
本学期我们对《数据结构》这门课程进行了学习。这门课程是一门实践性非常强的 课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设 计实习。这次课程设计不但要求学生掌握《数据结构》中的各方面知识,还要求学生具 备一定的 C 语言基础和编程能力。
{ int k; char *temp; if(len<=0) { *T=NULL;
沈阳理工大学
沈阳理工大学课程设计专用纸
No. 5
return; } *T=(BitNode*)malloc(sizeof(BitNode)); (*T)->data=*pre; for(temp=in;temp<in+len;temp++)
int h,lh,rh; if(T==NULL)
h=0; else {
lh=Depth(T->lchild); rh=Depth(T->rchild); if(lh>=rh)
h=lh+1; else
h=rh+1; } return h; }
沈阳理工大学
沈阳理工大学课程设计专用纸
No. 6
4、运行结果 先输入一棵树的先序遍历序列和中序遍历序列,然后构造出这颗二叉树,并输
(2)题目二的内容和要求: 1、算术表达式由操作数、运算符和界限符组成。操作数是正整数,运算符为 加减乘除,界限符有左右括号和表达式起始 2、将一个表达式的中缀形式转化为相应的后缀形式 3、依据后缀表达式计算表达式的值
沈阳理工大学
沈阳理工大学课程设计专用纸
c_语言_算术表达式的求值__数据结构_课程设计
//算术表达式的求值//济南大学信息学院计算机数据结构课程设计/*【问题描述】表达式计算式实现程序设计语言的的基本问题之一,也是栈的应用的一个典型例子,设计一个程序,演示用运算符优先法对算术表达式的求值的过程。
*///main.cpp#include "iostream.h"#include "stdlib.h"#include "public.h"#include "stack.h"//using namespace std;LinkStack OPTR;//操作符栈int Allnum[100]={0}; //储存所有的运算数int NUM[100]={0};//操作数栈int n=0;void calcu(){int x1,x2,x;char p;//弹出一个运算符Pop(OPTR,p);//弹出两个操作数x2=NUM[n--];x1=NUM[n--];//进行一次运算switch(p) {case '+':x=x1+x2;break;case '-':x=x1-x2;break;case '*':x=x1*x2;break;case '/':x=x1/x2;//结果压入操作数栈NUM[++n]=x;}int EvaluateExpression(char *p){InitStack(OPTR);InitStack(OPND);int i=0;char temp;int num=0;while( *p!='\0' )switch(*p){case '+': case '-':while ( (GetTop(OPTR,temp))!=ERROR && (temp!='('))//执行先遇到的加、减运算calcu();//当前运算符进栈Push(OPTR,*p);//读下一个字符p++;break;case '*': case '/':if ( GetTop(OPTR,temp)==OK && (temp=='*') || (temp=='/')) //执行先遇到的乘、除运算calcu();//当前运算符进栈Push(OPTR,*p);//读下一个字符p++;break;case '('://左括号进栈Push(OPTR,*p);//读下一个字符p++;break;case ')':while ( GetTop(OPTR,temp)==OK && temp!='(' )//执行括号内的加、减、乘、除运算calcu();//弹出左括号char e;Pop(OPTR,e);//读下一个字符p++;break;default://把字符串转换成整数值//int num=strInt(p);num=0;do {num=10*num+*p-'0';p++;} while((*p>='0')&&(*p<='9'));//char strnum[10];//NumString(num,strnum);//将num转换为字符串strnum//操作数进栈NUM[++n]=num;//s1[++t1]=v;Allnum[i++]=num;};while ( GetTop(OPTR,temp)==OK )calcu();//返回结果//printf("%d \n",NUM[1]);return NUM[n];}//EvaluateExpressionvoid main(){char a[100];//="5+(9-2*3)^2+3*(2+1)"; //="5*(40+6)-39";5+(9-2*3)^2+3*(2+1)int i=0;start:cout<<"算数表达式:_" ;cin>>a;cout<<EvaluateExpression(a)<<endl;//system("pause");cout<<"----------------"<<endl;goto start;}//public.henum Status{OK,ERROR,}; //定义枚举类型int strInt(char *p){//把字符串转换成整数值int num=0;do {num=10*num+*p-'0';p++;} while((*p>='0')&&(*p<='9'));return num;}///////////数字转换字符串void convert(int abc,char a[],int &i_num){if( abc/10!=0 )convert(abc/10,a,i_num);a[i_num]=abc%10+'0';i_num++;}void NumString(int abc,char a[]){if(abc<0) abc=-abc;int i_num=0;convert(abc,a,i_num);a[i_num]='\0';}//////////////////stack.h//typedef char char;typedef struct SNode{char data; //数据域struct SNode *next; //指针域}SNode,*LinkStack; //定义链栈结点Status InitStack( LinkStack &S ){//将S初始化为一个空的链栈S=( LinkStack ) malloc ( sizeof( SNode ) );if( S==NULL ) return ERROR; //内存空间申请不成功S->next=NULL;return OK;}Status DestroyStack(LinkStack &S){//销毁栈SLinkStack p;while(S->next){p=S->next;S->next=p->next;free(p);}free(S);return OK;}Status StackIsEmpty(LinkStack S){//判断栈是否为空if (S->next==NULL) return OK;return ERROR;}Status Push(LinkStack &S, char e){//将数据元素e插入到栈S的栈顶LinkStack p;p=( LinkStack ) malloc ( sizeof( SNode ) );if( p==NULL ) return ERROR;p->data=e;p->next=NULL; //创建新结点p->next=S->next;S->next=p; //插入return OK;}Status Pop(LinkStack &S, char &e){//将栈S的栈顶元素出栈,并存放到e中LinkStack p;if( S->next==NULL ) return ERROR; //空队出错p=S->next; //记住要删除的结点S->next=p->next; //栈顶元素p出栈e=p->data;free(p); //释放存储空间return OK;}Status GetTop(LinkStack S, char &e){LinkStack p;//char e;if( S->next==NULL ) return ERROR; //空队出错p=S->next;e=p->data;return OK;}。
数据结构课程设计报告-表达式求值
《数据结构》课程设计利用栈求表达式的值班级: 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设计分析.................................................................................. 错误!未指定书签。
2.1后缀表达式设计 .................................................................. 错误!未指定书签。
2.2中缀到后缀的转换设计 ....................................................... 错误!未指定书签。
3设计实践 .................................................................................. 错误!未指定书签。
3.1实现要求 ............................................................................... 错误!未指定书签。
3.2中缀表达式求值 .................................................................. 错误!未指定书签。
3.3后缀表达式求值 .................................................................. 错误!未指定书签。
3.4 中缀表达式转换成后缀表达式 ......................................... 错误!未指定书签。
利用栈求表达式的值课程设计最后老师改 - 副本
课程设计课程名称数据结构题目名称利用栈求表达式的值专业班级2014级网络工程(1)班学生姓名学号指导教师二○一六年六月十五日蚌埠学院计算机科学与技术系课程设计任务书蚌埠学院计算机科学与技术系本科课程设计成绩评定表目录1 概述 (6)1.1题目要求 (6)1.2输入要求 (6)1.3输出要求 (6)1.4实现要求 (7)2.需求分析 (8)2.1要求 (8)2.2任务描述 (8)2.3运行环境 (9)2.4开发工具 (9)3.总体设计 (10)3.1设计任务与目标 (10)3.2程序中的功能函数: (10)3.3方案设计与论证 (11)4算法说明 (12)4.1主要功能函数 (12)4.2函数间的调用关系 (13)4.4数据结构设计 (16)5 程序运行 (18)6 总结 (27)参考文献 (29)程序源代码 (30)1 概述栈是计算机中常用的一种数据结构,具有广泛的使用。
利用栈的性质及其操作原理编写一个使用栈计算表达式的程序有助于更好的掌握栈的使用规则和原理应用。
《数据结构课程设计》是理解和掌握数据结构的重要环节,主要任务是实现各种数据组织中的数据逻辑结构、存储结构以及有关操作的算法。
使学生学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当的逻辑结构、存储结构及相应的算法。
另一方面,通过团队合作、文档编制、主页设计等环节对学生进行全方位的训练,最终达到培养学生的数据抽象能力和软件设计的能力。
通过全部过程培养和锻炼学生的钻研能力、动手能力、分析问题和解决问题的实际能力。
1.1题目要求(1)按照分析、设计、编码、调试、测试的软件过程完成这个应用程序。
(2)为各项操作功能设计一个菜单,应用程序运行后,先显示这个菜单,然后用户通过菜单项选择希望进行的操作项目。
1.2输入要求(1)应用程序运行后在屏幕上显示一个菜单。
用户可以根据需求,选定相应的操作项目。
进入每个操作后,根据应用程序的提示信息,从键盘输入相应的信息。
数据结构课程设计--表达式求值问题
课程设计(论文)题目名称表达式求值问题课程名称数据结构课程设计学生姓名 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端为栈底。
利用栈实现表达式求值c语言
利用栈实现表达式求值c语言要实现表达式求值,我们可以使用一个数据结构来保存操作的优先级和操作数。
在这个例子中,我们将使用栈。
下面是一个使用C语言实现的基本例子:```cinclude <>include <>include <>include <>define MAX_STACK_SIZE 100typedef enum {NUMBER,PLUS,MINUS,MUL,DIV} Token;typedef struct Stack {Token data[MAX_STACK_SIZE];int top;} Stack;void push(Stack stack, Token data) {if (stack->top == MAX_STACK_SIZE - 1) {printf("Stack is full\n");return;}stack->top++;stack->data[stack->top] = data;}Token pop(Stack stack) {if (stack->top == -1) {printf("Stack is empty\n");return NUMBER; // return some default value when stack is empty}Token data = stack->data[stack->top];stack->top--;return data;}bool isOperator(Token token) {return token == PLUS token == MINUS token == MUL token == DIV;}bool isLeftAssociative(Token token) {return token == PLUS token == MINUS;}bool isRightAssociative(Token token) {return token == MUL token == DIV;}Token getPriority(Token token) {if (token == PLUS token == MINUS) return 1; // + and - have higher priority than and /if (token == MUL token == DIV) return 2; // and / have higher priority than + and -return 0; // if token is not an operator, return 0 as default value }bool isOperatorPriorityHigher(Token op1, Token op2) {return getPriority(op1) > getPriority(op2); // higher priority means higher value of getPriority() function result}bool isOperatorPrioritySame(Token op1, Token op2) {return getPriority(op1) == getPriority(op2); // same priority means getPriority() function result is equal for both operators}void evaluateExpression() {Stack stack; // create a stack to store tokens (numbers and operators) in reverse order of their appearance in the expression string= -1; // initialize stack top to -1 to indicate an empty stackchar expression[] = "3+52"; // example expression stringchar token = strtok(expression, " "); // tokenize the expression stringwhile (token != NULL) {if (isdigit(token[0])) { // if token is a number, push it to the stack push(&stack, NUMBER); // push the number to the stackpush(&stack, (Token)(atoi(token))); // convert the string to an integer and push it to the stack} else if (isOperator(atoi(token))) { // if token is an operator, push it to the stackpush(&stack, (Token)(atoi(token))); // convert the string to an operator and push it to the stack}token = strtok(NULL, " "); // continue tokenizing the expression string}while ( != -1) {Token data = pop(&stack); // pop the topmost element from the stackif (isOperator(data)) { // if popped element is an operator, apply it to the top two elements of the stackToken op2 = pop(&stack); // pop the topmost element from the stackToken op1 = pop(&stack); // pop the next topmost element from the stackif (isLeftAssociative(data)) { // apply left associative operator push(&stack, op1); // push the operand on which the operator is applied first to the stackpush(&stack, op2); // push the second operand to the stackpush(&stack, data); // push the operator to the stack。
数据结构试验:栈和队列实验——表达式求值
实验报告课程名称数据结构实验项目实验二--栈和队列实验系别___ _计算机学院 _ ______专业___ _计算机科学与技术___班级/学号__学生姓名 ____________实验日期成绩_______________________指导教师实验题目:实验二-----栈和队列实验一、实验目的1)掌握栈的顺序存储结构及队列的链式存储结构;2)验证栈的顺序存储结构的操作的实现;3)验证队列的链式存储结构的操作的实现;4)理解算法与程序的关系,能够将算法转换为对应程序。
二、实验内容1)建立一个顺序存储的空栈,并以此分别实现入栈、出栈、取栈顶元素;2)建立一个链式结构的空队列,并以此分别实现入队、出队、取队头等基本操作;3)尝试利用栈和队列的算法解决一些实际的应用问题。
设计与编码1)实验题目主要需求说明2)设计型题目:表达式求值(要求利用栈结构和运算符优先约定表,输入一个表达式,并计算求值)3)结合题目,说明利用栈或队列解决问题的基本算法描述4)程序源码#include<iostream>using namespace std;const int InitSize=100;const int IncreastSize=10;template<class datatype>class SqStack {private:datatype *base;datatype *top;int stacksize;public:SqStack();void DestroyStack();void ClearStack();int StackLength();bool IsEmpty();bool GetTop(datatype &e);bool Pop(datatype &e);bool Push(datatype e);};template<class datatype>SqStack<datatype>::SqStack(){base=new datatype[InitSize];if(!base)exit(1);top=base;stacksize=InitSize;}template<class datatype>void SqStack<datatype>::DestroyStack() {delete[] base;base=top=NULL;stacksize=0;}template<class datatype>void SqStack<datatype>::ClearStack() {top=base;}template<class datatype>int SqStack<datatype>::StackLength() {return top-base;}template<class datatype>bool SqStack<datatype>::IsEmpty() {if(top==base)return fasle;else return true;}template<class datatype>bool SqStack<datatype>::GetTop(datatype &e){if(top==base)return false;e=*(top-1);return true;}template<class datatype>bool SqStack<datatype>::Pop(datatype &e){if(top==base)return false;e=*(top-1);top--;return true;}template<class datatype>bool SqStack<datatype>::Push(datatype e){if(top-base>=stacksize){base=(datatype *)realloc( base , (stacksize+IncreastSize)*sizeof(int) ); if(!base)exit(1);top=base+stacksize;stacksize+=IncreastSize;}*(top)=e;top++;return true;}int com(char m,char t){if(t=='(') return -1;else if(t==')'){if(m=='+'||m=='-'||m=='*'||m=='/') return 1; else if(m=='(') return 0;else return -2;}else if(t=='*'||t=='/'){if(m=='+'||m=='-'||m=='#'||m=='(') return -1; else return 1;}else if(t=='+'||t=='-'){if(m=='#'||m=='(') return -1;else return 1;}else{if(m=='#')return 0;else if(m=='+'||m=='-'||m=='*'||m=='/') return 1; else return -2;}}void main(){SqStack <char> op;SqStack <double> re;char t,m;double result,flag=1;op.Push('#');t=getchar();while(true){if(t>='0'&&t<='9'){double s=0;s=s*10+t-'0';t=getchar();while(t>='0'&&t<='9' ){s=s*10+t-'0';t=getchar();}re.Push(s);}else if(t=='+'||t=='-'||t=='*'||t=='/'||t=='('||t==')'||t=='\n') { op.GetTop(m);while(com(m,t)==1 ){double x1,x2;op.Pop(m);if(re.Pop(x2)&&re.Pop(x1)){if(m=='+') re.Push(x1+x2);else if(m=='-') re.Push(x1-x2);else if(m=='*') re.Push(x1*x2);else if(m=='/') {if(x2!=0)re.Push(x1/x2); else flag=0;} }else flag=0;op.GetTop(m);}if(com(m,t)==-1)op.Push(t);else if(com(m,t)==0)op.Pop(m);else flag=0;if(!op.GetTop(m)) break;t=getchar();}else t=getchar();}if(re.GetTop(result)&&flag)cout<<result<<endl;else cout<<"Input error!\n";}5)运行结果三、总结与心得。
利用栈求表达式课程设计报告
《数据结构》课程设计报告专业计算机科学与技术班级(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用相应的函数。
数据结构课程设计-表达式求值问题
实验表达式求值问题1. 问题描述表达式是数据运算的基本形式。
人们的书写习惯是中缀式,如:11+22* (7-4 )/3. 中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。
表达式还有后缀表达式(如:11 22 7 4 - * 3 / + )和前缀表达式(+ 11 / * 22 - 7 4 3 )。
后缀表达式和前缀表达式中没有括号,给计算带来方便。
如后缀表达式计算时按运算符出现的先后进行计算。
本设计的主要任务是进行表达式形式的转换及不同形式的表达式计算。
2. 数据结构设计1)顺序栈类定义:首先应在类中定义成员函数,以此来完成顺序栈的相关操作,如下:class SqStackprivate:T *base; // 栈底指针int top; // 栈顶int stacksize; // 栈容量public:SqStack(int m); // 构建函数~SqStack(){delete [] base;top=0;stacksize=0;} // 析构函数void Push(T x); // 入栈T Pop(); // 出栈T GetTop(); // 获取栈顶元素int StackEmpty(); // 测栈空void ClearStack(); // 清空栈void StackTop(); // 返回栈顶指针void StackTranverse(); // 显示栈中元素};2)顺序栈类实现:对顺序栈进行初始化,初始化的首要操作就是创建一个空顺序栈。
Step1 :申请一组连续的内存空间为顺序栈使用:base=new T[m];i f(base==NULL)cout<<" 栈创建失败,退出!"<<endl; exit(1);}{Step2 :给栈顶、栈容量赋相应的值:stacksize=m;t op=-1;(2)顺序栈入栈:入栈需要在栈顶插入一个新元素并相应的调整栈顶。
(盐城工学院大大数据结构课程设计)栈地应用表达式求值
数据结构课程设计报告栈的应用:表达式求值的设计专业学生姓名班级学号指导教师 徐燕萍完成日期目录1设计内容 (1)2设计分析2.1系统需求分析 (1)2.1.1系统目标 (1)2.1.2主体功能 (1)2.2系统概要设计 (1)2.2.1系统的功能模块划分 (1)2.2.2系统流程图 (2)3设计实践3.1基本分析 (3)3.2中缀表达式求值 (4)3.3后缀表达式求值 (5)3.4中缀表达式转换成后缀表达式 (6)4测试方法4.1基本测试 (7)4.2拓展测试 (7)4.3容错测试 (8)5程序运行效果 (7)6设计心得 (8)7附录:源代码 (10)栈的应用:表达式求值的设计1 设计内容设计一个表达式求值的程序。
该程序必须可以接受包含(,),+,-,*,/,%,和^(求幂运算符,a^b=a b)的中缀表达式,并求出结果。
如果表达式正确,则输出表达式的结果;如果表达式非法,则输出错误信息。
2 设计分析2.1系统需求分析2.1.1系统目标利用栈设计一个程序,该程序能够用于表达式求值,程序将读入的中缀表达式转换为后缀表达式,然后读取后缀表达式,输出结果。
输入要求:程序从“input.txt”文件中读取信息,在这个文件中如果有多个中缀表达式,则每个表达式独占一行,程序的读取操作在文件的结尾处停止。
输出要求:对于每一个表达式,将其结果放在“output.txt”文件的每一行中。
这些结果可能是值(精确到小数点后两位),也可能是错误信息“ERROR IN INFIX NOTATION”。
2.1.2 主体功能能够处理以字符序列的形式输入的不含变量的实数表达式,正确处理负数与小数,判断表达式是否语法正确(包含分母不能为零的情况),正确实现对算术四则混合运算表达式的求值,能够将计算中遇到的问题和结果以文件的形式予以存储。
2.2系统概要设计2.2.1系统的功能模块划分1.判断操作数的函数isnum()判断当前所指字符是否属于数字,是就返回‘1’,不是就返回‘0’。
数据结构课程设计报告-表达式求值
}
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转换成数值
数据结构(C语言版)课程设计报告表达式求值说明书
数据结构(C语言版)课程设计报告表达式求值说明书XX大学数据结构课程设计说明书题目:表达式求值院系:计算机科学与工程学院专业班级:计算机班学号:学生姓名:指导教师:2021年X月X日XX大学课程设计(论文)任务书计算机科学与工程学院学号学生姓名专业(班级)设计题目表达式求值设计技术参数系统平台:Windows7/WindowsXP开发工具:VC++6.0设计要求(1)能够计算的运算符包括:加、减、乘、除、圆括号。
(2)能够计算的数要求在实数范围内。
(3)能执行多重括号嵌套运算。
(4)对于异常表达式给出错误提示。
工作量课程设计报告要求不少于3000字。
源程序要求不少于300行工作计划2021.11.21-12.01根据课程设计大纲的要求,查找相关资料,完成需求分析;2021.12.02-12.16进行系统的概要设计;2021.12.17-12.31进行系统的详细设计和源代码的书写;2021.01.01-01.17对系统进行调试分析,写出课程设计报告。
参考资料[1]何钦铭主编.C语言程序设计.北京:高等教育出版社,2021.[2]谭浩强编著.C程序设计(第四版).北京:清华大学出版社,2021.[3]严蔚敏,吴伟民编著.数据结构(C语言版)北京:清华大学出版社,2021.[4]严蔚敏,吴伟民编著.数据结构题集北京:清华大学出版社,2021.指导教师签字教研室主任签字2021年X月X日学生姓名:学号:专业班级:课程设计题目:表达式求值指导教师评语:成绩:指导教师:年月日XX大学课程设计(论文)成绩评定表目录1需求分析12概要设计12.1设计思路12.2存储结构设计12.3功能模块设计13详细设计14运行与测试15总结1参考文献2(要求:给出一级目录和二级目录,宋体,四号字,1.5倍行距,页码使用罗马数字,居中)(报告正文部分):(要求:正文部分一律用小四号字,宋体,行距20磅。
一级标题靠左,加粗。
二级大标题靠左,不加粗。
课程设计之利用栈求值
课程设计之利用栈求值一、教学目标本节课的学习目标为:知识目标:学生需要掌握栈的基本概念,了解栈的性质和用途,理解栈的操作原理。
技能目标:学生能够运用栈解决基本的计算问题,例如逆波兰表达式的求值。
情感态度价值观目标:通过解决实际问题,激发学生对计算机科学的兴趣,培养学生的逻辑思维能力和创新精神。
二、教学内容本节课的教学内容主要包括:1.栈的定义和性质:介绍栈的基本概念,解释栈的先进后出(FILO)特性。
2.栈的操作:讲解栈的压入(push)和弹出(pop)操作,以及栈的遍历。
3.逆波兰表达式:介绍逆波兰表达式的概念,解释其与栈的关系。
4.利用栈求值:引导学生运用栈来求解逆波兰表达式,培养学生的实际操作能力。
三、教学方法为了提高教学效果,本节课将采用以下教学方法:1.讲授法:讲解栈的基本概念、性质和操作。
2.案例分析法:通过分析具体的逆波兰表达式求值实例,引导学生掌握利用栈解决问题的一般方法。
3.实验法:安排课堂练习,让学生亲自动手操作,验证所学知识。
4.讨论法:学生进行小组讨论,分享学习心得,互相解答疑问。
四、教学资源为了支持教学内容的传授和教学方法的实施,我们将准备以下教学资源:1.教材:提供相关章节,为学生提供理论知识的学习依据。
2.多媒体资料:制作课件,以图文并茂的形式展示栈的概念和操作。
3.实验设备:提供计算机及相关设备,让学生进行课堂练习。
4.在线资源:推荐相关的学习和论坛,方便学生课后自主学习和交流。
五、教学评估本节课的评估方式包括:1.平时表现:观察学生在课堂上的参与程度、提问回答等情况,了解学生的学习态度和理解程度。
2.作业:布置相关的练习题,评估学生对栈知识掌握的情况。
3.考试:安排一次课堂小测,测试学生对逆波兰表达式求值的掌握程度。
评估方式应客观、公正,能够全面反映学生的学习成果。
通过评估,教师可以了解学生的学习情况,及时进行教学调整。
六、教学安排本节课的教学安排如下:1.进度:按照教材的章节顺序,逐步讲解栈的知识点和逆波兰表达式的求值方法。
课程设计表达式求值
课程设计报告课程名称:数据结构课程设计课程设计题目:表达式求值问题姓名:余明旭系:计算机科学与技术专业:计算机科学与技术年级:2010级学号:100310236指导教师:陈老师职称:学生详细设计此算法的基本思想:首先置操作数栈OPS为空栈,表达式起始符“#”为运算符的栈底元素;依次读入表达式中每个字符,若是操作数则进栈,若是运算符则和OPF栈的栈顶运算符比较优先权作相应操作,直至整个表达式求值完毕(即OPF栈的栈顶元素和当前读入的字符均为“#”)此算法的伪代码:ElementType EvaluateExpression(char *exp){ 定义两个字符变量c和ch,c代表输入表达式中的字符,ch代表栈顶运算符;定义字符指针*p,*q,*temp;temp指向运算符后面的一个字符double i=0,a=0,b=0;将传入的实参赋给p,q;定义一个运算符栈OPF;定义一个操作数栈OPS;调用函数InitStack()初始化栈OPS;调用函数CInitCharStack()初始化栈OPF;调用函数CPush(OPF,'#')将#压入运算符栈;c=*p;temp=p;p++;if(第一个字符就为‘-’){c=*p;temp=p;p++;}while(栈不为空或表达式没有结束){//进入最外层循环if(不是运算符)//则解析数字字符串然后进操作数栈{整数部分m=0;小数部分n=0;while(没有遇到小数点并且为数字字符){ 解析整数部分m }if(遇到小数点){ 解析小数部分c=*p;将p指针移到第一个出现的字符;将q指针指向小数的最后一位;while(p指针不指向’.’){将p指向的字符转为小数np--;}p=q;p++;}if(运算符为‘-’并且运算符前一个为‘(’或者为表达式的开始)调用Push(OPS,-(m+n))将m+n的相反数入栈;else调用Push(OPS,m+n)将m+n入栈;}数字进栈结束else//是运算符时则进栈OPF{ if(运算符为‘-’&&运算符前一个为‘(’){ c=*p;temp=p;p++;}else{ 调用函数CGetTop(OPF,ch)得到OPF的栈顶元素;switch(调用函数Precede(ch,c)判断栈顶元素与接收的字符的优生级别) {case 栈顶运算符优先权低:调用函数CPush(OPF,c)将c入运算符栈;接收下一个字符;case 栈顶运算符优先权高:运算符出栈得到ch;数字栈连续出栈两次得到a,b ;调用Operate(a,ch,b)并将结果入栈到数字栈;break;case 优生权相等:脱括号并接收下一个字符;调用CPop(OPF,ch)脱括号;接收下一个字符;default:接收下一个字符;}退出switch循环}//else1}//else2}//退出最外层while循环调用函数GetTop(OPS,i)得到栈顶元素i;将两个栈消毁;}EvaluateExpression函数结束源代码#include<stdlib.h># include <stdio.h># include <string.h>#define ERROR 0#define OK 1#define TRUE 1#define FALSE 0typedef char ElemType;typedef int Status;typedef double ElementType;typedef int Status;# define STACK_INIT_SIZE 30# define STACKINCREAMENT 10# define NUMBER 30typedef struct node{ElementType data;struct node *next;}StackNode, *LinkStack;void InitStack(LinkStack &head){head=(LinkStack)malloc(sizeof(StackNode));head->next=NULL;}Status IsEmpty(LinkStack head){if(head->next==NULL)return TRUE;else return ERROR;}Status Push(LinkStack &head,ElementType element){//入栈LinkStack p;p=(LinkStack)malloc(sizeof(StackNode));if(p== NULL) return FALSE;p->data=element;p->next=head->next;head->next=p;return OK;}Status Pop(LinkStack &head,ElementType &element){//出栈if(IsEmpty(head))return FALSE;LinkStack temp=head->next;element=temp->data;head->next=temp->next;free(temp);return OK;}Status GetTop(LinkStack head, ElementType &element){ if(head->next==NULL)return ERROR;element =head->next->data;return OK;}Status DestroyStack(LinkStack &head){LinkStack q;while(head){q=head->next;free(head);head=q;}return TRUE;}//这个栈是用来存储符号字符的typedef struct node1{ElemType data;struct node1 *next;}StackCharNode,*LinkCharStack;void CInitCharStack(LinkCharStack &head){head=(LinkCharStack)malloc(sizeof(StackCharNode));head->next=NULL;}Status CIsEmpty(LinkCharStack head){return (head->next==NULL)?TRUE:FALSE;}Status CPush(LinkCharStack &head,ElemType element){LinkCharStack temp=(LinkCharStack)malloc(sizeof(StackCharNode));if(!temp)return ERROR;temp->data=element;temp->next=head->next;head->next=temp;return TRUE;}Status CPop(LinkCharStack &head,ElemType &element){if(CIsEmpty(head))return FALSE;StackCharNode *temp=head->next;element=temp->data;head->next=temp->next;free(temp);return TRUE;}Status CGetTop(LinkCharStack head,ElemType &element){if(head->next!=NULL){element=head->next->data;return TRUE;}element='#';return FALSE;}Status CDestroyStack(LinkCharStack &head){LinkCharStack q;while(head){q=head->next;free(head);head=q;}return TRUE;}//判断ch是否为运算符int Comop(char ch){switch(ch){case '+':case '-':case '*':case '/':case '(':case ')':case '[':case ']':case '{':case '}':case '#':return 1;default:return 0;}}//Comop//比较两个运算符的优先级char Precede(char ch,char c)//ch是栈顶字符,c 是表达式字符{switch(ch){case '+':case '-':if(c=='+'||c=='-'||c==')'||c=='#'||c==')'||c==']'||c=='}')return '>';if(c=='*'||c=='/'||c=='('||c=='['||c=='{')return '<';case '*':case '/':if(c=='+'||c=='-'||c=='*'||c=='/'||c==')'||c==']'||c=='}'||c=='#')return '>';if(c=='('||c=='['||c=='{')return '<';case '(':if(c=='+'||c=='-'||c=='*'||c=='/')return '<';if(c==')')return '=';case ')':if(c=='+'||c=='-'||c=='*'||c=='/'||c==']')return '>';if(c=='#')return '>';case'[':if(c=='+'||c=='-'||c=='*'||c=='/'||c=='(')return '<';if(c==']')return '=';case']':if(c=='+'||c=='-'||c=='*'||c=='/'||c=='}')return '>';if(c=='#')return '>';case'{':if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c=='[')return '<';if(c=='}')return '=';case'}':if(c=='+'||c=='-'||c=='*'||c=='/')return '>';if(c=='#')return '>';case '#':if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c=='['||c=='{')return '<';if(c=='#')return '=';default:return '$';}}//precede//运算函数ElementType Operate(ElementType a,char ch,ElementType b){switch(ch){case '+':return a+b;case '-':return a-b;case '*':return a*b;case '/':if(b==0){return -32767;}return a/b;default:return -32767;}}//Operate//错误提示函数int error(char *str){int i=0;while(str[i]!='#') //主要通过判断所有输入的字符数组str[30]{if( ((str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='.')&& //其它函数只要一声明err=1也就说明输入有误(str[i+1]==')'||str[i+1]==']'||str[i+1]=='}'))||((str[i]=='+'||str[i]=='*'||str[i]=='/'||str[i]=='.')&&(str[i-1]=='('||str[i-1]=='['||str[i-1]=='{'))||((str[i]==')' || str[i]==']'||str[i]=='}')&& str[i+1]=='.')||(str[i]=='.' &&( str[i+1]=='('||str[i+1]=='['||str[i+1]=='{'))||(str[i]==')' && str[i+1]=='(')||(str[i]=='(' && str[i+1]==')')||(str[i]=='[' && str[i+1]==']')||(str[i]==']' && str[i+1]=='[')||(str[i]=='{' && str[i+1]=='}')||(str[i]=='}' && str[i+1]=='{')||((str[i]==')'||str[i]==']'||str[i]=='}') && str[i+1]>='0'&&str[i+1]<='9')||((str[i]>='0'&&str[i]<='9'&& (str[i+1]=='('||str[i+1]=='['||str[i+1]=='{'))||(str[0]=='+'||str[0]=='*'||str[0]=='/'||str[0]==')'||str[0]==']'||str[0]=='}')||((str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='.')&&(str[i+1]=='+'||str[i+1]=='-'||str[i+1]=='*'||str[i+1]=='/'||str[i+1]=='.'))||(int(str[i])>57&&(int(str[i])!=91 && int(str[i])!=93 && int(str[i])!=123 && int(str[i])!=125))||(str[i]=='/' && str[i+1]=='0')||(int(str[i])>31 && int(str[i])<38)))return 1;else if(str[i]=='#')return 0;i++;}//whilereturn 0;}//错误提示函数//表达式计算函数ElementType EvaluateExpression(char *exp){char c,ch; //c代表输入表达式中的字符,ch代表栈顶运算符char *p,*q,*temp;//temp指向运算符后面的一个字符double i=0,a=0,b=0;p=q=exp;LinkCharStack OPF;//运算符栈LinkStack OPS;//操作数栈CInitCharStack(OPF);CPush(OPF,'#');InitStack(OPS);c=*p;temp=p;p++;if(c=='-'){c=*p;temp=p;p++;}while(c!='#'||!CIsEmpty(OPF)) //栈不为空或表达式没有结束{//*********************进入最外层循环********************* if(!Comop(c))//不是运算符则解析数字字符串然后进操作数栈{double m=0,n=0;while(c!='.'&&c>='0'&&c<='9'){//解析整数部分m=m*10+(c-48);c=*p;p++;}if(c=='.'){//解析小数部分c=*p;while(c>='0'&&c<='9'){p++;c=*p;}q=p;p--;while(*p!='.'){n=n/10+(*p-48)/10.0;p--;}p=q;p++;}if(*(temp-2)=='('&&*(temp-1)=='-'||temp-1==exp) Push(OPS,-(m+n));elsePush(OPS,m+n);}//*****数字进栈结束******else//是运算符时则进栈OPF{if(c=='-'&&*(p-2)=='('){c=*p;temp=p;p++;}else//else1{CGetTop(OPF,ch);switch(Precede(ch,c)){case '<'://栈顶运算符优先权低CPush(OPF,c);c=*p;temp=p;p++;break;case '>'://栈顶运算符优先权高CPop(OPF,ch);Pop(OPS,b);Pop(OPS,a);Push(OPS,Operate(a,ch,b));break;case '='://脱括号并接收下一个字符CPop(OPF,ch);c=*p;temp=p;p++;break;default:c=*p;temp=p;p++;}//switch}//else1}//else2}//退出最外层循环GetTop(OPS,i);DestroyStack(OPS);CDestroyStack(OPF);return i;}//EvaluateExpression函数结束//菜单函数void MenuPrint(){printf("\t\t┌─────────┐\n");printf("\t\t│多功能计算器│\n");printf("\t\t├(a)表达式求解│\n");printf("\t\t├(b)清屏│\n");printf("\t\t├(c)退出│\n");printf("\t\t└─────────┘\n");} //菜单函数//清屏函数void Clear(){ system("cls");MenuPrint();}//清屏函数//main主函数void main(){double result=0;char exp[NUMBER],c;freopen("DS1.in", "r", stdin);freopen("DS1.out", "w", stdout);Clear();printf("\t\t请输入你要进行的操作:\n");while(1){scanf("%c",&c);switch(c){ case 'a':Clear();sr:printf("输入要计算的表达式,以##结束\n");scanf("%s",exp);if(!error(exp)){ result=EvaluateExpression(exp);printf("计算结果为:%lf\n",result);printf("请根据屏幕提示选择要进行的操作:\n");scanf("%d",&c);break;}else if(error(exp)){printf("您输入的表达式有误!");goto sr;}case 'b':Clear();printf("\t\t请输入你要进行的操作:");scanf("%d",&c);break;break;case 'c':system("cls");exit(1);default:printf("输入有误!");}//switch}//while}//main调试分析与结果测试数据组别表达式正确值1 12+(9-8)*7-(-6*5)492 3.14*(67.305-65.305)+3.14 9.423 3+{2*[2*(3+4)]} 314 4.3-{2.5*[9.9/(1.1+2.2)]} -3.25 12-(3-6*7)8-4 错误表达式表达式一运算结果表达式二运行结果表达式三运行结果表达式四运行结果由表二可知以上四组表达式运行结果皆正确。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.设计结果与分析
①在Microsoft Visual C++ 6.0环境中输入源程序,在没有提示错误的情况下编译,运行文件。
在输入表达式回车后显示表达式的值(值为正)。
图5 输入正确表达式运行的正值结果
②在输入表达式回车后显示表达式的值(值为负)。
图6 输入正确表达式后运行的负值结果
③输入一个表达式,在表达式中括号不正确的情况下,显示的提示信息。
图7 输入括号不正确的表达式的运行结果
④输入一个表达式,在表达式中包含不是数学字符的字符时现实的信息。
图8 输入含有非数学字符的表达式的运行结果
⑤输入exit退出程序。
图9 输入exit退出程序的运行结果。