当前位置:文档之家› 用栈进行表达式求值并输出逆波兰式(源代码)

用栈进行表达式求值并输出逆波兰式(源代码)

用栈进行表达式求值并输出逆波兰式(源代码)
用栈进行表达式求值并输出逆波兰式(源代码)

用栈进行表达式求值并输出逆波兰式(源代

码)

#include "stdio.h"

#include "malloc.h"

#include "string.h"

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

typedef struct{

char *top,*base;

int csize;

}*charstack,cstack;

typedef struct{

float *top,*base;

int fsize;

}*floatstack,fstack;

charstack initcharstack(){

charstack s;

s=(charstack)malloc(sizeof(cstack));

s->base=s->top=(char*)malloc(STACK_INIT_SIZE * sizeof(char));

s->csize=STACK_INIT_SIZE;

return s;

}

floatstack initfloatstack(){

floatstack s;

s=(floatstack)malloc(sizeof(fstack));

s->base=s->top=(float*)malloc(STACK_INIT_SIZE * sizeof(float));

*(s->top)=-1;

s->fsize=STACK_INIT_SIZE;

return s;

}

char chargettop(charstack s){

return *(s->top-1);

}

float floatgettop(floatstack s){

return *(s->top-1);

}

void charpush(charstack s,char c){

if((s->top-s->base)>=s->csize){

s->base =(char *)realloc(s->base ,(s->csize +STACKINCREMENT)*sizeof(char));

s->top=s->base +s->csize ;

s->csize +=STACKINCREMENT;

}

*s->top++=c;

}

void floatpush(floatstack s,float a){

if((s->top-s->base)>=s->fsize){

s->base =(float *)realloc(s->base ,(s->fsize +STACKINCREMENT)*sizeof(float));

s->top=s->base+s->fsize ;

s->fsize +=STACKINCREMENT;

}

*s->top++=a;

}

char charpop(charstack s){

char c;

c=*(s->top-1);

s->top--;

return c;

}

float floatpop(floatstack s){

float a;

a=*(s->top-1);

s->top--;

return a;

}

int in(char c){

char s[7]={'+','-','*','/','(',')','#'};

int i;

for(i=0;i<7;i++)

if(s[i]==c) return 1;

return 0;

}

float operate(float a,char c,float b){

switch(c){

case '+':return (a+b);

case '-':return (a-b);

case '*':return (a*b);

case '/':return (a/b);

default :return 0.0;

}

}

int charstackempty(charstack s){

if(s->base==s->top)

return 1;

return 0;

}

char precede(char c1,char c2){

char s[7]={'+','-','*','/','(',')','#'};

char str[7][7]={'>','>','<','<','<','>','>',

'>','>','<','<','<','>','>',

'>','>','>','>','<','>','>',

'>','>','>','>','<','>','>',

'<','<','<','<','<','=',' ',

'>','>','>','>',' ','>','>',

'<','<','<','<','<',' ','='};

int i=0,j=0;

while(s[i]!=c1)

i++;

while(s[j]!=c2)

j++;

return str[i][j];

}

float evaluateexpression(char *str){

charstack optr;

floatstack opnd;

char c1;

float a,b;

int i=0;

optr=initcharstack();

opnd=initfloatstack();

charpush(optr,'#');

while(str[i]!='#'||chargettop(optr)!='#'){

if(!in(str[i])){

floatpush(opnd,str[i]-48.0);

i++;

}

else{

if(chargettop(optr)=='#'){

charpush(optr,str[i]);

i++;

}

else

switch(precede(chargettop(optr),str[i])){

case '<':

charpush(optr,str[i]);

i++;

break;

case '=':

c1=charpop(optr);

i++;

break;

case '>':

c1=charpop(optr);

a=floatpop(opnd);

b=floatpop(opnd);

floatpush(opnd,operate(b,c1,a));

break;

}

}

}

printf("\n");

return floatgettop(opnd);

}

char* Ipn(char *s){

charstack s1,s2;

int length=0;

char *p=s,ch,*result;

s1=initcharstack();

s2=initcharstack();

charpush(s2,'#');

for( ;*p!='#';p++){

switch(*p){

case '(':

charpush(s2,*p);

break;

case ')':

while(chargettop(s2)!='('){

ch=charpop(s2);

charpush(s1,ch);

}

ch=charpop(s2);

break;

case '+':

case '-':

for(ch=chargettop(s2);ch!='#';ch=chargettop(s2)){

if(ch=='(')

break;

else{

ch=charpop(s2);

charpush(s1,ch);

}

}

charpush(s2,*p);

length++;

break;

case '*':

case '/':

for(ch=chargettop(s2);ch!='#'&&ch!='+'&&ch!='-';ch=chargettop(s2)){ if(ch=='(')

break;

else{

ch=charpop(s2);

charpush(s1,ch);

}

}

charpush(s2,*p);

length++;

break;

default:

charpush(s1,*p);

length++;

}

}

while(!charstackempty(s2)&&chargettop(s2)!='#'){

ch=charpop(s2);

charpush(s1,ch);

}

result=(char*)malloc(sizeof(char)*(length+1));

result+=length;

*result='\0';

result--;

for( ;!charstackempty(s1);result--){

ch=charpop(s1);

*result=ch;

}

++result;

return result;

}

void main(){

float r;

char str[100],*s;

printf("Input one expression ending with #:\n\t");

gets(str);

s=Ipn(str);

printf("The Reverse Polish Nation of the expression is:\n\t%s",s);

printf("\n");

r=evaluateexpression(str);

printf("The result is %f.\n\n",r);

}

算术表达式求值演示程序

数理学院 课程设计报告书 课程名称数据结构课程设计 设计题目算术表达式求值演示 专业班级 学号 姓名 指导教师

2014 年12 月

4.2.2 基本操作: InitStack(&S) 操作结果:构造一个空栈S。 GetTop(S) 初始条件:栈S 已存在。 操作结 果: 用P 返回S的栈顶元素。Push(&S 初始条 件:,ch) 栈S 已存在。 操作结 果:插入元素ch 为新的栈顶元素。 Pop(&S) 初始条件:栈S 已存在。 操作结 果:删除S 的栈顶元素。 In(ch) 操作结果:判断字符是否是运算符,运算符即返回1 Precede(c1, c2) 初始条件:c1,c2 为运算符。操作结果:判断运算符优先权,返回优先权高的。Operate(a,op,b) 初始条件:a,b 为整数,op为运算符。操作结果: a 与 b 进行运算,op 为运算符,返回其值。num(n) 操作结果:返回操作数的长度。EvalExpr() 初始条件:输入表达式合法。操作结果:返回表达式的最终结果。}ADT Stack 主程序的流程:

EvaluateExpression() 函数实现了对表达式求值的功能,main() 函数直接调用EvaluateExpression() 对输入的表达式求值输出。 4.2.3 函数的调用关系图

4.3 详细设计 4.3.1 ① . Precede(char c1,char c2)判断运算符优先权,返回优先权高的 算符间的优先关系 如下: 算法伪代码如下: char Precede(char c1,char c2) { static char array[49]={ >', '>', '<', '<', '<', '>', '>', >', '>', '<', '<', '<', '>', '>', >', '>', '>', '>', '<', '>', '>', >', '>', '>', '>', '<', '>', '>', <', '<', '<', '<', '<', '=', '!', >', '>', '>', '>', '!', '>', '>', <', '<', '<', '<', '<', '!', '='}; // 用一维数组存储 49 种情况 switch(c1) { /* i 为下面 array 的横标 */ case '+' : i=0;break; case '-' : i=1;break; case '*' : i=2;break;

利用栈实现c语言计算器

栈的应用:C实现简单计算器(表达式的计算) 作为栈的著名应用,表达式的计算可以用下面方法实现: 首先建立两个栈,操作数栈NUM_S和运算符栈OPR_S。 其中,操作数栈用来存储表达式中的操作数;运算符栈用来存储表达式中的运算符。可以用字符‘=’来表示表达式结束符。 自左至右的扫描待处理的表达式,并假设当前扫描到的符号为W,根据不同的符号W 做如下不同的处理: 1.若W为操作数,则将W压入操作数栈NUM_S,且继续扫描下一个字符; 2.若W为运算符,则根据运算符的性质做相应的处理: (0)若符号栈为空,无条件入栈当前指针指向的字符 (1)若w为不大于运算符栈栈顶的运算符,则从操作数栈NUM_S中弹出两个操作数,设先后弹出的操作数为a、b,再从运算符栈 OPR_S中弹出一个运算符,比如为+,然后作运算a+b,并将运算结果压入操作数栈NUM_S。 (2)若w为左括号或者运算符的优先级大于运算符栈栈顶的运算符,则将运算符W 压入运算符栈OPR_S,并继续扫描下一个字符。 (3)若运算符W为右括号,循环操作(设先后弹出的操作数为a、b,再从运算符栈OPR_S中弹出一个运算符,比如为+,然后作运 算a+b, 并将运算结果压入操作数栈NUM_S),直到从运算符栈中弹出第一个左括号。 (4)若运算符W为表达式结束符‘=’,循环操作(设先后弹出的操作数为a、b,再从运算符栈OPR_S中弹出一个运算符,比如为 +,然后作运算a+b, 并将运算结果压入操作数栈NUM_S),直到运算符栈为空为止。此时,操作数栈栈顶元素即为表达式的 值。 ====================================================================== === 举例:计算3+(5-2*3)/4-2= (1)开始栈为空,3入栈,+入栈,(无条件入栈,5入栈,-号优先级比(高,所以-号入栈,2入栈,*优先级比目前栈顶的-号优先级高,所以*入栈,3入栈,接着扫描到)括号,)括号不入栈 | | | | --------- ---------- | 3 | | * | --------- ---------- | 2 | | - |

数据结构算术表达式求值实验报告

软件技术基础实验报告 实验名称:表达式计算器 系别:通信工程 年级: 班级: 学生学号: 学生姓名: 《数据结构》课程设计报告 题目简易计算表达式的演示 【题目要求】 要求:实现基本表达式计算的功能 输入:数学表达式,表达式由整数和“+”、“-”、“×”、“/”、“(”、“)”组成输出:表达式的值 基本操作:键入表达式,开始计算,计算过程和结果记录在文档中 难点:括号的处理、乘除的优先级高于加减

1.前言 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为简化,规定操作数只能为正整数,操作符为+、-*、/、=,用#表示结束。 算法输出:表达式运算结果。 算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。 2.概要设计 2.1 数据结构设计 任何一个表达式都是由操作符,运算符和界限符组成的。我们分别用顺序栈来寄存表达式的操作数和运算符。栈是限定于紧仅在表尾进行插入或删除操作的线性表。顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top 指示栈顶元素在顺序栈中的位置,base 为栈底指针,在顺序栈中,它始终指向栈底,即top=base 可作为栈空的标记,每当插入新的栈顶元素时,指针top 增1,删除栈顶元素时,指针top 减1。 2.2 算法设计 为了实现算符优先算法。可以使用两个工作栈。一个称为OPTR ,用以寄存运算符,另一个称做OPND ,用以寄存操作数或运算结果。 1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素; 2.依次读入表达式,若是操作符即进OPND 栈,若是运算符则和OPTR 栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR 栈的栈顶元素和当前读入的字符均为”#”)。 2.3 ADT 描述 ADT Stack{ 数据对象:D={ i a |i a ∈ElemSet,i=1,2,…,n, n ≧0} 数据对象:R1={< 1 ,-i i a a >| 1-i a ,D a i ∈,i=2,…,n}

用栈进行表达式求值并输出逆波兰式(源代码)

用栈进行表达式求值并输出逆波兰式(源代 码) #include "stdio.h" #include "malloc.h" #include "string.h" #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct{ char *top,*base; int csize; }*charstack,cstack; typedef struct{ float *top,*base; int fsize; }*floatstack,fstack; charstack initcharstack(){ charstack s; s=(charstack)malloc(sizeof(cstack)); s->base=s->top=(char*)malloc(STACK_INIT_SIZE * sizeof(char)); s->csize=STACK_INIT_SIZE; return s; } floatstack initfloatstack(){ floatstack s; s=(floatstack)malloc(sizeof(fstack)); s->base=s->top=(float*)malloc(STACK_INIT_SIZE * sizeof(float)); *(s->top)=-1; s->fsize=STACK_INIT_SIZE; return s; } char chargettop(charstack s){ return *(s->top-1); } float floatgettop(floatstack s){ return *(s->top-1); } void charpush(charstack s,char c){ if((s->top-s->base)>=s->csize){ s->base =(char *)realloc(s->base ,(s->csize +STACKINCREMENT)*sizeof(char)); s->top=s->base +s->csize ; s->csize +=STACKINCREMENT; }

表达式求值算法实现

湖南人文科技学院计算机科学技术系 课程设计说明书 课程名称:数据结构 课程代码:408024 题目: 表达式求值 年级/专业/班:08级计算机科学与技术二班 学生姓名: 黄胜李业芝黄自强 黄沅涛姚洋 学号:08408210 08408211 08408212

08408213 08408215 指导教师: 袁辉勇 开题时间: 2009 年12 月21 日 完成时间: 2010 年 1 月 1 日

目录 摘要 (1) 一、引言 (3) 二、设计目的与任务 (3) 1、课程设计目的 (3) 2、课程设计的任务 (4) 三、设计方案 (4) 1、需求分析 (4) 2、概要设计 (4) 3、详细设计 (6) 4、程序清单 (13) 四、调试分析与体会 (17) 五、运行结果 (18) 六、结论 (20) 七、致谢 (21) 八、参考文献 (21)

摘要 在高级语言环境中算术表达上的结果是通过语言环境预设的算法的思想计算出来的,然而高级语言初学者并不了解表达式的计算过程和方法。本文采用算符优先分析和堆栈的方法给出了算术表达式的计算过程。 所以本次课程设计的程序是在Windows系统上为用户解决包括加、减、乘、除以及括号在内的四则混合运算。用户可通过键盘输入四则运算,经过程序运行之后,可以判断出用户所输入的表达式是否正确。如果正确,就给出表达式的值;如果不正确,就提示输入有误。 关键词:四则混合运算;高级语言;栈 Abstract The arithmetic expression result is the algorithm thought which supposes in advance through the language environment calculatesin the higher order language environment,however the higher order language beginner does not understand the expression the computationprocess and the method. This article used the operator first to analyze and the storehouse method has given the arithmetic expression computa-tion process. Therefore, the procedure in this curriculum design is the solution for users on Windows systems, including add, subtract, multiply, divide and brackets, including four hybrid operation. Users can enter via the keyboard 4 operation, after a program is running, you can determine the user entered expression is correct. If correct, it gives the value of the expression; if not correct, it prompted an error.

逆波兰表达式求值(实验报告及C 源码)

逆波兰表达式求值 一、需求分析 1、从键盘中输入一个后缀表达式,该表示包括加减乘除等操作符,以及正整数作为操 作数等。 2、用堆栈来实现 3、测试数据 输入:2 3 * 1 – # 输出:2 3 * 1 -- =5 二、概要设计 抽象数据类型 需要一个浮点数栈来存储还没有计算的浮点数或者运算的结果。 ADT Stack 数据成员:int size; int top; //分别用于存储栈大小、栈顶位置 float *listArray;//存储浮点型数字的数组 成员函数: bool push(float it); bool pop(float& it); bool isEmpty(); //判断栈为空 bool isOne();//判断栈是否只有一个元素 算法的基本思想 1.逐一扫描字符串,用ascii码进行判断,如果该字符是数字,则利用x=x*10+str[i]-48 将数据由字符类型转换为浮点型数据; 2.如果字符是‘.’,则将‘.’转化为小数点,并将‘.’后的数据转化为小数部分; 3.遇到空格前是数据的,将x押入栈; 4.如果该字符是’+’,’-’,’*’或’/’,判断栈里的元素是否少于两个个,如果少于两个, 报错;如果大于等于两个,就弹出两个数据,并进行相应的计算; 程序的流程 输入字符串,程序对字符串依次扫描。扫描一位,处理一位。扫描完成后,判断栈里是不是只有一个数据,若是,得到正确结果;若不是,则表达式出错。 三、详细设计 物理数据类型 用浮点数类型的栈存储运算中要用的数据,需要入栈、出栈,故设计如下的浮点类型的栈: class Stack { private: int size; int top; float *listArray; public: Stack(int sz=20); ~Stack();

栈的应用表达式求值的设计

数据结构课程设计报告 栈的应用:表达式求值 专业 计算机科学与技术 学生姓名 班级 学 号 指导教师 完成日期 2014年7月4日

表达式求值的设计 目录 1设计内容 (1) 2设计分析 (1) 2.1后缀表达式设计 (1) 2.2 中缀到后缀的转换设计 (2) 3设计实践 (3) 3.1实现要求 (3) 3.2程序代码 (3) 4测试方法 (17) 4.1测试目的 (17) 4.2 测试输入 (17) 4.3 正确输出 (18) 4.4 实际输出 (18) 5程序运行效果 (18) 6设计心得 (19)

栈的应用:表达式求值的设计 1设计内容 设计一个表达式求值的程序。该程序必须可以接受包含(,),+,-,*,/,%,和^(求幂运算符,a^b=a b)的中缀表达式,并求出结果。如果表达式正确,则输出表达式的结果;如果表达式非法,则输出错误信息。 输入要求:程序从“input.txt”文件中读取信息,在这个文件中如果有多个中缀表达式,则每个表达式独占一行,程序的读取操作在文件在文件的结尾处停止。 输出要求:对于每个表达式,将其结果放在“output.txt”文件的每一行中。这些结果可能是值,也可能是错误信息“ERROR IN INFIX NOTATION”。 2 设计分析 在计算机中,算术表达式的计算往往是通过使用栈来实现的。所以,本表达式求值程序的最主要的数据结构就是栈。可以使用栈来存储输入表达式的操作符和操作数。 输入的表达式是由操作数(又称运算对象)和运算符以及改变运算次序的圆括号连接而成的式子。算术表达式有中缀表示法和后缀表示法,本程序输入的表达式采用中缀表示法,在这种表达式中,二元运算符位于两个操作数中间。 由于不同运算符之间存在优先级,同一优先级的运算间又存在着运算结合顺序的问题,所以简单的从左到右的计算是不充分的。当然凭直观判断一个中缀表达式中哪个运算符最先,哪个次之,哪个最后并不困难,但通过计算机处理就比较困难了。因为计算机只能一个字符一个字符地扫描,要想知道哪个运算符先算,就必须对整个中缀表达式扫描一遍。 而后缀表达式则很容易通过应用栈实现表达式的计算,这为实现表达式求值程序提供了一种直接的计算机制。 2.1后缀表达式设计 后缀表达式是由一系列的运算符、操作数组成的表达式,其中运算符位于两个操作数之后。后缀表达式很容易通过应用栈实现表达式的计算。其基本过程是:当输入一个操作数时,它被压入栈中,当一个运算符出现时,就从栈中弹出适当数量的操作数,对该运算进行计算,计算结果再压回栈中。对于最常见的二元运算符来说,弹出的操作数只有两个。处理完整个后缀表达式之后,栈顶上的元素就是表达式的结果值。整个计算过程不需要理解计算的优先级规则。

C语言_算术表达式求值_代码

源代码: //用来存储字符的结点类型 typedef struct CharNode { char c; struct CharNode *next; }CharNode; //用来存储数的结点类型 typedef struct IntNode { long double i; struct IntNode *next; }IntNode; //用来存储数的结点类型 typedef struct Node { long double n; struct Node_ys_char *next; }Node; //用来存储运算符的结点类型 typedef struct Node_ys_char { char c; struct Node_ys_char *next_c; struct Node *next; }Node_ys_char; char Precede(char x,char y)//运算符优先级判断{ int i,j; int from[5][5] ={ {0,0,-1,-1,0}, {0,0,-1,-1,0}, {1,1,0,0,1},

{1,1,0,0,1}, {0,0,-1,-1,0} };//定义一个二维数组存放算术符号的优先级 switch(x) { case '+':i=0;break; case '-':i=1;break; case '*':i=2;break; case '/':i=3;break; case '#':i=4;break; } switch(y) { case '+':j=0;break; case '-':j=1;break; case '*':j=2;break; case '/':j=3;break; case '#':j=4;break; } if(from[i][j]==1)//说明运算符i的优先级比j的优先级高return '>'; if(from[i][j]==-1) return '<'; else return '='; } //输入表达式,并对特殊情况做处理 CharNode *CreatRegister() { CharNode *top,*p,*q,*e; top=(CharNode *)malloc(sizeof(CharNode)); p=q=top; scanf("%c",&p->c); scanf("%c",&p->c);

实验2 栈和队列的应用-算术表达式求值

1.实验题目 栈和队列的应用 2.实验内容 算术表达式求值 3.实验目的 掌握栈和队列的概念及工作原理,运用其原理完成实验题目中的内容。 4.实验要求 为了更好的掌握与理解课堂上老师所讲的概念与原理,实验前要认真预习所做的实验内容及编写源程序伪码(写在纸上及盘中均可)以便在实验课中完成老师所布置的实验内容。 5.概要设计原理 6.详细程序清单及注释说明 #include #include #include #include #define NULL 0 #define OK 1 #define OVERFLOW -2 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 20 /* 定义字符类型栈*/ typedef struct { int stacksize; char *base; char *top; }SqStack; /* ----------------- 全局变量--------------- */ SqStack OPTR,OPND;// 定义运算符栈和操作数栈 char expr[255]; /* 存放表达式串*/ char *ptr=expr; int InitStack(SqStack *s) //构造运算符栈 { s->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char)); if(!s->base) exit(OVERFLOW);

s->top=s->base; s->stacksize=STACK_INIT_SIZE; return OK; } char In(char ch) //判断字符是否是运算符,运算符即返回1 { return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#'); } int Push(SqStack *s,char ch) //运算符栈插入ch为新的栈顶元素{ *s->top=ch; s->top++; return 0; } char Pop(SqStack *s) //删除运算符栈s的栈顶元素,用p返回其值{ char p; s->top--; p=*s->top; return p; } char GetTop(SqStack s)//用p返回运算符栈s的栈顶元素 { char p=*(s.top-1); return p; } /* 判断运算符优先权,返回优先权高的*/ char Precede(char c1,char c2) { int i=0,j=0; static char array[49]={ '>', '>', '<', '<', '<', '>', '>', '>', '>', '<', '<', '<', '>', '>', '>', '>', '>', '>', '<', '>', '>', '>', '>', '>', '>', '<', '>', '>', '<', '<', '<', '<', '<', '=', '!', '>', '>', '>', '>', '!', '>', '>', '<', '<', '<', '<', '<', '!', '='};

数据结构课程设计:算术表达式

表达式求值 一目的 利用《数据结构》课程的相关知识完成一个具有一定难度的综合设计题 目,利用C/C++语言进行程序设计,并规地完成课程设计报告。通过课程设计,巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决方法(包括问题描 述、系统分析、设计建模、代码实现、结果分析等);提高利用计算机分析解决综合性实际问题的基本能力。设计一个程序,演示以字符序列的形式输入不含变量的实数表达式求值的计算结果 二需求分析 设计一个程序,演示以字符序列的形式输入不含变量的实数表达式求值的计算结果。对于这个程序我们从输入,输出,和功能三方面来分析。 1.程序输入:从键盘上输入表达式,一个算术表达式,由常量、运算符和括号组成(以字符串形式输入,不含变量)。为了简化,操作数只能为浮点数,操作符为“ +”、“-”、“*”、“/”、“(”、“)”,用“#“表示结束。 2.程序输出:表达式运算结果,运算符栈、运算数栈、输入字符和主要操作变化过程,如运算符栈、运算数栈的出入记录,字符出入栈的过程,打印出完整的过程。 3.功能要求及说明:从键盘上输入表达式。分析该表达式是否合法(包含分母不能为零的情况): (1)是数字,则判断该数字的合法性。 (2)是规定的运算符,则根据规则进行处理。在处理过程中,将计算该表达式的值。 (3)若是其它字符,则返回错误信息。 若上述处理过程中没有发现错误,则认为该表达式合法,并打印处理结果。 三概要设计 1.数据结构的选择: 任何一个表达式都是由操作符,运算符和界限符组成的。我们分别用顺序栈来寄存表达式的操作数和运算符。栈是限定于紧仅在表尾进行插入或删除操作的线性表。

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

中北大学 数据结构 课程设计说明书 2011年12月20日

1. 设计任务概述(包括系统总体框图及功能描述) 此课题是研究表达式求值的问题,以帮助小学生完成测试。为了达到这个功能,实际我们要做的就是出题,和计算分数给出评价的工作。整体设计都是以这个要求为轴心进行的。为了直观和方便,现画出软件整体设计模块图。 整体设计模块图可以清晰的看出软件的几大模块。整个系统的操作流程图可以看出操作的整体流程,如下图 2.

根据以上功能说明,设计运算信息,堆栈的存储结构,设计程序完成功能; 3. 功能模块详细设计 在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义)。 3.1 详细设计思想 学生要进行测试,首先要有试题。那么我们就要先建立试题库。这个试题库的试题是我们在程序运行过程中手动输入,存放在一个shujuku.txt的文件中。 首先在主函数中调用创建试题库函数,将试题存入到试题库文件shitiku.txt中,然后将该调用从主函数中删除。 创建试题库函数:创建指向xuanti类型的指针,利用循环将输入的测试题该指针的xuanti单元中,最后将该指针中的测试题写入试题库文件shitiku.txt中。 3.2 核心代码 (正文宋体小四号字,1.5倍行距) #include #include #include #include #include #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define ERROR 0 #define OK 1 //定义表达式

表达式求值程序设计说明书

汇编语言实训课程设计任务书 题目:表达式求值程序班级:计算机科学与技术一班 学生姓名:赵旭尧学号: 14730141 题目类型:软件工程(R)指导教师:刘树群 一.题目简介 该设计要求学生使用汇编语言,设计并开发出针对四则运算表达式进行求 值的命令行或窗口程序。 通过该题目的设计过程,可以培养学生结构化程序设计的思想,加深对汇 编语言基本语言要素和流程结构的理解,针对汇编语言中的重点和难点内容进 行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。 得到软件工程的综合训练,提高解决实际问题的能力。 二.设计任务 1、查阅文献资料,一般在5篇以上; 2、通过键盘输入表达式,进行针对整数的“加减乘除”四则运算表达式 进行求值,有良好的界面; 3、完成软件结构设计和算法设计; 4、完成系统的软件开发和测试工作; 5、撰写设计说明书; 6、做好答辩工作。 三.主要内容、功能及技术指标 1、实现功能及指标:①使用Win32的窗口程序模式,实现表达式求值程序 及测试界面程序的设计与开发;②支持整数的四则运算、位运算和小括号等; ③使用文本框对表达式进行交互式编辑和输出。 2、问题分析及解决方案框架确定:充分地分析和理解问题本身,弄清要求 做什么。在确定解决方案框架过程中,综合考虑系统功能,考虑怎样使系统结 构清晰、合理、简单和易于调试。最后确定每个过程和函数的简单功能,以及 过程(或函数)之间的调用关系,并画出函数之间的调用关系图。 3、详细设计和编码:定义相应的存储结构,确定各个函数的算法,并画出 流程图,在此基础上进行代码设计,每个明确的功能模块程序一般不超过200 行,否则要进一步划分。

利用栈求表达式的值

数据结构课程设计 姓名:杨颂敬 班级:软件0901班 学号:0930*******

目录: 1.需求分析 (1) 2.概要设计 (1) 3.详细设计................................. 3-6 4.调试分析................................. 6-8 5.用户使用说明 (8) 6.测试结果 (9) 7.附录 (9)

利用栈求表达式的值,可供小学生作业,并 能给出分数。 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) {

基于栈结构的中缀表达式求值

实验3:栈与队列实验 ——基于栈结构的中缀表达式求值 一、问题描述 从键盘输入任意中缀表达式字符串,读字符串,利用栈结构实现表达式求值。 二、输入与输出 输入:从键盘中缀表达式如: 32+5×(6-4) 输出:计算结果42 三、需求分析 1.定义两个栈结构,数栈用于存放表达式中的数,符号栈用于存放表达式中的符号,实现栈的运算 2.在读数的时候考虑多位运算 3.实现表达式求值 四、开发工具与环境 硬件设备:微型计算机系统 软件环境:操作系统Windows 开发工具:Devc++ 五、概要设计 参考结构定义 typedef struct /* 运算符栈 */ { char *base,*top; int stacksize; }SqStack; typedef struct /* 运算数栈 */ { int *base,*top; int stacksize; }SqStack1; int priority[7][7]={{'>', '>', '<', '<', '<', '>', '>'}, // + {'>', '>', '<', '<', '<', '>', '>'}, // -

{'>', '>', '>', '>', '<', '>', '>'}, // * {'>', '>', '>', '>', '<', '>', '>'}, // / {'<', '<', '<', '<', '<', '=', ' '}, // ( {'>', '>', '>', '>', ' ', '>', '>'}, // ) {'<', '<', '<', '<', '<', ' ', '='} // # }; /*用于比较符号优先级的全局二维数组*/ 2.各函数模块 void InitStack(SqStack *s); 操作结果:初始化运算符栈 char GetTop(SqStack *s); 操作结果:得到运算符栈的栈顶元素 void Push(SqStack *s,char e); 操作结果:对运算符栈进行压栈操作 int IsNumber(char c); 操作结果:判断一个字符是否是数字 int MidExpression_Eval(char Express[]); 操作结果:计算中缀表达式的值 int Operate (int a,char x,int b); 操作结果:计算表达式axb,并返回结果 六、详细设计 #include #include using namespace std; /*定义区*/ #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OVERFLOW -1 #define ERROR 0 #define OK 1 //运算符栈 typedef struct { char *base, *top; int stacksize; }SqStack; //运算数栈 typedef struct { int *base, *top; int stacksize;

《大数据结构》算术表达式求值

实用标准文档 二课程设计2——算术表达式求值 一、需求分析 二、程序的主要功能 三、程序运行平台 四、数据结构 五、算法及时间复杂度 六、测试用例 七、程序源代码 三感想体会与总结 算术表达式求值 一、需求分析 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。 二、程序的主要功能 (1)从键盘读入一个合法的算术表达式,输出正确的结果。 (2)显示输入序列和栈的变化过程。 三、程序运行平台

Visual C++ 6.0版本 四、数据结构 本程序的数据结构为栈。 (1)运算符栈部分: struct SqStack //定义栈 { char *base; //栈底指针 char *top; //栈顶指针 int stacksize; //栈的长度 }; int InitStack (SqStack &s) //建立一个空栈S { if (!(s.base = (char *)malloc(50 * sizeof(char)))) exit(0); s.top=s.base; s.stacksize=50; return OK; } char GetTop(SqStack s,char &e) //运算符取栈顶元素 { if (s.top==s.base) //栈为空的时候返回ERROR { printf("运算符栈为空!\n"); return ERROR; } else e=*(s.top-1); //栈不为空的时候用e做返回值,返回S的栈顶元素,并返回OK return OK; }

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

//1.h #include #include #include #include #include using namespace std; //template struct Ti //定义一个结构体,用于存储题习题库中的每一道台?题目 { char chh[30]; }; template struct Stack //定义栈,其中数据元素为字符型í { T data[50]; int top; }; template struct Stack2 //定义栈,其中数据元素为整型í { float data[50]; int top; }; template

class link { public: void Push(Stack &S,char x); char Pop(Stack &S,char x); void Push2(Stack2 &S,float x); float Pop2(Stack2 &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 setStack(); Stack2 setStack2(); }; //1.cpp #include #include"1.h" #include #include #include #include

c语言实现一.二叉树操作 二.用栈实现算术表达式求值 课设报告

目录 题目一.二叉树操作(1)二.算术表达式求 (1) 一、课程设计的目的 (1) 二、课程设计的内容和要求 (1) 三、题目一设计过程 (2) 四、题目二设计过程 (6) 五、设计总结 (17) 六、参考文献 (18)

题目一.二叉树操作(1)二.算术表达式求 一、课程设计的目的 本学期我们对《数据结构》这门课程进行了学习。这门课程是一门实践性非常强的课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设计实习。这次课程设计不但要求学生掌握《数据结构》中的各方面知识,还要求学生具备一定的C语言基础和编程能力。 (1)题目一的目的: 1、掌握二叉树的概念和性质 2、掌握二叉树的存储结构 3、掌握二叉树的基本操作 (2)题目二的目的: 1、掌握栈的顺序存储结构和链式存储结构 2、掌握栈的先进后出的特点 3、掌握栈的基本运算 二、课程设计的内容和要求 (1)题目一的内容和要求: 1、编写已知二叉树的先序、中序序列,恢复此二叉树的程序 2、编写求二叉树深度的程序 (2)题目二的内容和要求: 1、算术表达式由操作数、运算符和界限符组成。操作数是正整数,运算符为 加减乘除,界限符有左右括号和表达式起始 2、将一个表达式的中缀形式转化为相应的后缀形式 3、依据后缀表达式计算表达式的值

三、题目一设计过程 1、题目分析 现已知一棵二叉树的先序遍历序列和中序遍历序列,依次从先序遍历序列中取结点,由先序序列确定根结点(就是第一个字母),每次取出一个结点就与中序遍历的序列进行比较,当相等的时候,中序遍历序列就被分成以该结点为根的二叉树子树,该结点左部分为左子树,右部分为右子树,直到取完先序列里的所有结点,则二叉树构造完毕(树用链式存储结构存储),用递归实现! 由建好的二叉树,先判断这棵树是否为空,若不为空则找数的左子树,统计它的高度,然后找树的右子树,统计它的高度,比较左子树和右子树的高度,然后返回其中大的那个值加一,则求出数的高度。这里用递归实现! 2、算法描述 main ( )(主函数) 先构造一颗二叉树,初始化为空,用来存储所构造的二叉树,并输入一棵树的先序序列和中序序列,并统计这个序列的长度。然后调用实现功能的函数。 void CreateBiTree(BiTree *T,char *pre,char *in,int len)(由先序序列和中序序列构造二叉树) 根据前序遍历的特点, 知前序序列(pre)的首个元素(pre[0])为根(root), 然后在中序序列(in)中查找此根(pre[0]), 根据中序遍历特点, 知在查找到的根(root) 前边的序列为左子树, 后边的序列为右子树。设根前边有n个元素,则又有, 在前序序列中,紧跟着根(root)的n个元素序列(即pre[1...n]) 为左子树, 在后边的为右子树,而构造左子树问题其实跟构造整个二叉树问题一样,只是此时前序序列为pre[1...n]), 中序序列为in[0...n-1], 分别为原序列的子串, 构造右子树同样。这里用递归实现! int Depth(BiTree T)(求树的深度) 当所给的参数T是NULL时,返回0。说明这个树只有一个叶子节点深度为0,当所给的参数不是NULL时,函数调用自己看看这个参数的左分支是不是NULL,

程序设计实训报告—表达式求值问题

程序设计实训报告— 表达式求值问题 完成者:何炜 班级:计科1501 学号: 完成日期:2016年7月14日星期四

目录 一、题目的内容及要求................................. 错误!未定义书签。 二、需求分析 ................................................ 错误!未定义书签。 三、概要设计 ................................................ 错误!未定义书签。 四、详细设计 ................................................ 错误!未定义书签。 五、源代码 .................................................... 错误!未定义书签。 六、运行结果及分析..................................... 错误!未定义书签。 七、收获及体会............................................. 错误!未定义书签。

一、题目的内容及要求 求解形如(a+b)*((c+d)*e+f*h*g)的简单算术表达式的求值问题。这种表达式只包括加、减、乘、除4种运算符。 为了实现表达式求值,可以首先读入原表达式(包括括号)并创建对应二叉树,其次对二叉树进行前序遍历、中序遍历、后续遍历(非递归),并输出逆波兰表达式,最后求解原表达式的值,同时对非法表达式格式能予以判断。 用二叉树的结构来存储表达式,后续遍历二叉树即可得到逆波兰表达式 二、需求分析 本程序能解决形如(a+b)*((c+d)*e+f*h*g)并以’#’作为结束标志的简单算术表达式的求值问题。 不仅能够求解出多位浮点数,而且能够对简单的非法表达式进行判断以避免程序异常退出。 三、概要设计 1.用户输入中缀表达式 2.程序将中缀表达式用二叉树的链式存储结构存储下来 3.前序、中序遍历这颗二叉树,输出对应的前缀、中缀表达式 4.后续遍历(非递归)这颗二叉树,并把遍历结果存储在顺序栈内, 并输出后缀表达式 5.对后缀表达式进行求值

相关主题
文本预览
相关文档 最新文档