表达式求值问题++数据结构

表达式求值问题++数据结构
表达式求值问题++数据结构

《数据结构》

课程设计报告书课程题目:表达式求值问题

一.需求分析

(1)以字符序列的形式从终端输入语法正确的不含变量的整数表达式,将该中缀表达式转换为后缀表达式。

(2)实现对后缀表达式的求值。

(3)演示在求值过程中运算符栈,操作数栈,输入字符和主要操作的变化过程。

二.概要设计

表达式求值的算法分为两步进行:首先将中缀表达式转换为后

缀表达式,再求后缀表达式的值。

(1)将中缀表达式转换为后缀表达式,对于字符串形式的合法的中缀表达式,“(”的运算优先级最高,“*”次

之,“+”,“—”最低,同级运算符从左到右按顺序运

算。转化过程算法描述如下:从左到右对中缀表达式

进行扫描,每次处理一个字符。若遇到左括号入栈。

如遇到数字,原样输出。若遇到运算符,如果它的优

先级比栈顶元素优先级高,则直接入栈,否则栈顶元

素出栈,直到新栈顶数据元素的优先级比它低,然后

将它直接入栈。重复以上步骤,直到表达式结束。若

表达式已全部结束,将栈顶元素全部出栈。

(2)后缀表达式求值算法描述如下:从左到右对后缀表达式进行扫描,每次处理一个字符。若遇到数字,转化

为整数,入栈。若遇到运算符,出栈两个值进行运算,

运算结果再入栈。重复以上步骤,直到表达式结束,

栈中最后一个数据元素就是所求表达式的结果。三.详细设计

#include

#include

#define TRUE 1

#define FALSE 0

#define MAXNUM 100

typedef int DataType;

struct SeqStack

{ DataType s[MAXNUM];

int t;

};

typedef struct SeqStack *PSeqStack;

PSeqStack createEmptyStack_seq()

{

PSeqStack pastack;

pastack = (PSeqStack)malloc(sizeof(struct SeqStack));

if (pastack == NULL)

printf("Out of space!!\n");

else

pastack->t = -1;

return pastack;

} int isEmptyStack_seq(PSeqStack pastack)

{

return pastack->t == -1;

} void push_seq(PSeqStack pastack, DataType x)

{

if (pastack->t >= MAXNUM - 1)

printf("Overflow!\n");

else

{

pastack->t = pastack->t + 1;

pastack->s[pastack->t] = x;

}

} void pop_seq(PSeqStack pastack)

{

if (pastack->t == -1)

printf("Underflow!\n");

else

pastack->t = pastack->t - 1;

} DataType top_seq(PSeqStack pastack)

{

return pastack->s[pastack->t];

} int infixtoSuffix(const char * infix, char * suffix)

{ /*将中缀表达式转换为后缀表达式,顺利转换返回true,若转换过程中发现中缀表达式非法则返回false*/

int state_int = FALSE;

/*state_int记录状态,等于true表示刚读入的是数字字符,等于false表示刚读入的不是数字字符,

设置这个变量是为了在每输出一个整数后输出一个空格,以免连续输出的两个整数混在一起。*/

char c, c2;

PSeqStack ps = createEmptyStack_seq(); /*运算符栈*/

int i, j = 0;

if (infix[0] == '\0')

return FALSE; /*不允许出现空表达式*/

for (i = 0; infix[i] != '\0'; i++)

{

c = infix[i];

switch (c)

{

case ' ':

case '\t':

case '\n':

if (state_int == TRUE)

suffix[j++] = ' ';/*状态从true转换为false时输出一个空格*/

state_int = FALSE;

break; /*遇到空格或制表符忽略*/

case '0':

case '1':

case '2':

case '3':

case '4':

case '5':

case '6':

case '7':

case '8':

case '9':

state_int = TRUE;

suffix[j++] = c; /*遇到数字输出*/

break;

case '(':

if (state_int == TRUE)

suffix[j++] = ' ';/*状态从true转换为false时输出一个空格*/

state_int = FALSE;

push_seq(ps, c); /*遇到左括号,入栈*/

break;

case ')':

if (state_int == TRUE)

suffix[j++] = ' ';/*状态从true转换为false时输出一个空格*/ state_int = FALSE;

c2 = ')';

while (!isEmptyStack_seq(ps))

{

c2 = top_seq(ps);/*取栈顶*/

pop_seq(ps); /*出栈*/

if (c2 == '(')

{

break;

}

suffix[j++] = c2;

}

if (c2 != '(')

{

free(ps);

suffix[j++] = '\0';

return FALSE;

}

break;

case '+':

case '-':

if (state_int == TRUE)

suffix[j++] = ' ';

state_int = FALSE;

while(!isEmptyStack_seq(ps))

{

c2 = top_seq(ps);

if (c2 == '+' || c2 == '-' || c2 == '*' || c2 == '/')

{

pop_seq(ps);

suffix[j++] = c2;

}

else if(c2=='(') break;

}

push_seq(ps, c);

break;

case '*':

case '/':

if (state_int == TRUE)

suffix[j++] = ' ';

state_int = FALSE;

while (!isEmptyStack_seq(ps))

{

c2 = top_seq(ps);

if (c2 == '*' || c2 == '/')

{

pop_seq(ps);

suffix[j++] = c2;

}

else if(c2=='+'||c2=='-'||c2=='(') break;

}

push_seq(ps, c);

break;

default:

free(ps);

suffix[j++] = '\0';

return FALSE;

}

}

if (state_int == TRUE) suffix[j++] = ' ';

while (!isEmptyStack_seq(ps))

{

c2 = top_seq(ps);

pop_seq(ps);

if (c2 == '(')

{

free(ps);

suffix[j++] = '\0';

return FALSE;

}

suffix[j++] = c2;

}

free(ps);

suffix[j++] = '\0';

return TRUE;

} int calculateSuffix(const char * suffix, int * presult) {

int state_int = FALSE;

PSeqStack ps = createEmptyStack_seq();

int num = 0, num1, num2;

int i;

char c;

for (i = 0; suffix[i] != '\0'; i++) {

c = suffix[i];

switch (c)

{

case '0':

case '1':

case '2':

case '3':

case '4':

case '5':

case '6':

case '7':

case '8':

case '9':

if (state_int == TRUE)

num = num * 10 + c - '0'; else num = c - '0';

state_int = TRUE;

break;

case ' ':

case'\t':

case '\n':

if (state_int == TRUE)

{

push_seq(ps, num);

state_int = FALSE;

}

break;

case '+':

case '-':

case '*':

case '/':

if (state_int == TRUE)

{

push_seq(ps, num);

state_int = FALSE;

}

if (isEmptyStack_seq(ps)) {

free(ps);

return FALSE;

}

num2 = top_seq(ps);

pop_seq(ps);

if (isEmptyStack_seq(ps))

{

free(ps);

return FALSE;

}

num1 = top_seq(ps);

pop_seq(ps);

if (c == '+')

push_seq(ps, num1 + num2);

if (c == '-')

push_seq(ps, num1 - num2);

if (c == '*')

push_seq(ps, num1 * num2);

if (c == '/')

push_seq(ps, num1 / num2);

break;

default:

free(ps);

return FALSE;

}

}

*presult = top_seq(ps);

pop_seq(ps);

if (!isEmptyStack_seq(ps))

{

free(ps);

return FALSE;

}

free(ps);

return TRUE;

} void getline(char * line, int limit)

{

char c;

int i = 0;

while (i < limit - 1 && (c = getchar()) != EOF && c != '\n') line[i++] = c;

line[i] = '\0';

} void main()

{ char c, infix[MAXNUM], suffix[MAXNUM];

int result;

int flag = TRUE;

while (flag == TRUE)

{

printf("请输入表达式:\nInput:");

getline(infix, MAXNUM);

if(infixtoSuffix(infix, suffix) == TRUE)

printf("suffix:%s\n", suffix);

else

{

printf("输入有错误!\n");

printf("\nContinue? (y/n)");

scanf("%c", &c);

if (c == 'n' || c == 'N') flag = FALSE;

while (getchar() != '\n');

printf("\n");

continue;

}

if(calculateSuffix(suffix, &result) == TRUE)

printf("Result:%d\n", result);

else

printf("输入有错误!\n");

printf("\n是否继续? (y/n)");

scanf("%c", &c);

if (c == 'n' || c == 'N') flag = FALSE;

while (getchar() != '\n');

printf("\n");

}

}

四.调试分析

(1) 用栈的结构来解决表达式的求值,首先要解决的问题是如

何将人们习惯书写的中缀表达式转换成计算机容易处理的后缀表达式。开始有些茫然,后来通过结合课本和同学的帮助完成了该课题。

(2) 对一些看似简单的东西掌握不够熟练,比如由于函数的调

用参数问题不熟而造成了调试的困难。对于语法的掌握也欠缺成熟,需要进一步掌握。

(3)栈的结构理解不够清晰,造成了设计程序时理不清头绪,

需要对数据结构有更深层次的理解。五.过程演示

中缀表达式转换到后缀表达式的转换过程示例:

后缀表达式的计算过程示例:

五.测试结果

成绩:

指导教师:

日期:年月日

成绩:

指导教师:

日期:年月日

逆波兰表达式求值(实验报告及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();

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

竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告 篇一:数据结构实验二——算术表达式求值实验报告 《数据结构与数据库》 实验报告 实验题目算术表达式求值 学院:化学与材料科学学院 专业班级:09级材料科学与工程系pb0920603 姓学 邮名:李维谷号:pb09206285箱: liwg@https://www.360docs.net/doc/6110081723.html,指导教师:贾伯琪 实验时间:20XX年10月10日 一、需要分析 问题描述: 表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。

问题分析: 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。 在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。 算法规定: 输入形式:一个(:数据结构表达式求值实验报告)算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。 输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。 程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。 测试数据:正确输入:12*(3.6/3+4^2-1)#

算术表达式的求解-数据结构课程设计报告

课程设计报告 题目:算术表达式求值 一、需求分析 1、设计要求: 给定一个算术表达式,通过程序求出最后的结果 1>、从键盘输入要求解的算术表达式; 2>、采用栈结构进行算术表达式的求解过程; 3>、能够判断算术表达式正确与否; 4>、对于错误表达式给出提示; 5>、对于正确的表达式给出最后的结果; 2、设计构想: 为了实现算符优先算法使用两个工作栈,一个称作OPTR,以寄存运算符;另一个称作OPND,用以寄存操作数或运算结果。在操作数和操作符入栈前,通过一个函数来判别,输入的是操作数还是操作符,操作数入OPND,操作符入OPTR。在输入表达式的最后输入‘#’,设定‘#’的优先级最低,代表表达式输入结束。在表达式输入过程中,遇操作数则直接入栈,遇到运算符则与栈顶运算符比较优先级,若当前运算符优先级高,则当前运算符入栈,扫描下一符号;否则栈顶运算符出栈,两操作数出栈,进行运算,所得结果入数栈,重新比较当前运算符与新栈顶运算符。如此重复直到栈顶运算符与当前符号均为‘#’,运算结束。 二、概要设计 1、本程序包含的模块:

(1)栈模块——实现栈抽象数据类型 (2)运算模块——实现数据表达式的运算(3)主程序模块 三、详细设计 (1)栈模块 1、定义栈结构 struct Sqstack

{ elemtype *top;//栈顶元素 elemtype *base; //栈底元素 int stacksize;//栈的大小 }; 2、栈的基本操作 ①初始化栈 status initstack(struct Sqstack &s) { s.base=(elemtype *)malloc(stack_size*sizeof(elemtype)); if(!s.base) return OVERFLOW; s.top=s.base; s.stacksize=stack_size; return OK; } ②入栈 status push(struct Sqstack &s,elemtype e) {

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

《数据结构与数据库》 实验报告 实验题目 算术表达式求值 学院:化学与材料科学学院 专业班级:09级材料科学与工程系PB0920603 姓名:李维谷 学号:PB09206285 邮箱:liwg@https://www.360docs.net/doc/6110081723.html, 指导教师:贾伯琪 实验时间:2010年10月10日 一、需要分析 问题描述:

表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。 问题分析: 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。 在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。 算法规定: 输入形式:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。 输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。 程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。 测试数据:正确输入:12*(3.6/3+4^2-1)# 输出结果:194.4

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

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

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}

C语言程序设计形成性考核册参考答案

一、选择题 1. 在每个C语言程序中都必须包含有这样一个函数,该函数的函数名为(A)。 A.main B.MAIN C.name D.funtion 2.C语言原程序文件的缺省扩展名为(A)。 A.cpp B.exe C.obj D.C 3.由C语言目标文件连接而成的可执行的缺省扩展名为(B)。 A.cpp B.exe C.obj D.C 4.程序运行中需要从键盘输入多于一个数据时,各数据之间应使用(D)符号作为分隔符。A.空格或逗号 B.逗号或回车 C.回车或分号 D.空格或回车 5.每个C语言程序的编译错误分为(B)类。 A.1 B.2 C.3 D.4 6.设x和y均为逻辑值,则x && y为真的条件是(A)。 A.它们均为真 B.其中一个为真 C.它们均为假 D.其中一个为假 7.设有语句“int a=12;a+=a*a;”,则执行结束后,a的值为(C)。 A.12 B.144 C.156 D.288 8.x>0 && x<=10的相反表达式为(A)。 A.x<=0 || X>10 B.x<=0 && x>10 C.x<=0 || x<=10 D.x>0 && x>10 9.字符串“a+b=12\n”的长度为(B)。 A.6 B.7 C.8 D.9 10.在下列符号常量定义中。错误的定义语句格式为(C)。 A.const M1=10; B.const int M2=20; C.const M3 10 D.const char mark=’3’; 11.带有随机函数的表达式rand()%20的值在(C)区间内, A.1~19 B.1~20 C.0~19 D.0~20 12.当处理特定问题时的循环次数已知时,通常采用(A)循环来解决。 A.for B.while C.do-while D.switch 13.在switch语句的每个case块中,假定都是以break语句结束的,则此switch语句容易被改写为(B)语句。 A.for B.if C.do D.while 14.for语句能够被改写为(D)语句。 A.复合 B.if C.switch D.while 15.下面循环语句执行结束后输出的i值为(B)。 for(int i=0;in/2){cout<

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

实验表达式求值问题 1.问题描述 表达式是数据运算的基本形式。人们的书写习惯是中缀式,如:11+22*(7-4)/3.中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。表达式还有后缀表达式(如:11 22 7 4 - * 3 / +)和前缀表达式(+ 11 / * 22 - 7 4 3)。后缀表达式 和前缀表达式中没有括号,给计算带来方便。如后缀表达式计算时按运算符出现的先后进行计算。本设计的主要任务是进行表达式形式的转换及不同形式的表达式计算。 2.数据结构设计 (1)顺序栈类定义:首先应在类中定义成员函数,以此来完成顺序栈的相关操作,如下: class SqStack { private: 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<<"栈创建失败,退出!"<

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);

数据结构表达式求值代码

//代码部分: #include using namespace std; #define MAXSIZE 100 typedef char ElemType;//定义栈 typedef struct{ char a[MAXSIZE]; int top;//栈顶指针 }SqStack; char op[8]={'+','-','*','/','(',')','#'};//运算符集 char ch[7][7]={ //运算符优先关系集{'>','>','<','<','<','>','>'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=',' '}, {'>','>','>','>',' ','>','>'}, {'<','<','<','<','<',' ','='} }; void InitStack(SqStack &s) { for(int i=0;i

ElemType Pop(SqStack &s,ElemType &e) { if (s.top==0) { cout<<"Stack is empty!"<

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

目录 1.前言 (2) 2.问题描述 (3) 3.总体设计·····················································································错误!未定义书签。 3.1 概要设计 ······························································································错误!未定义书签。 3.1.1 数据结构的选择 (3) 3.1.2 相关功能函数 (3) 3.1.3 函数模块调用关系 (4) 3.2详细设计和编码 (5) 4.运行与测试 (9) 4.1 上机调试 (9) 4.2 算法时间和空间性能分析 (10) 4.3程序运行测试结果 (11) 5. 总结与心得 (13) 5.1设计中难点的总结以及其它解决方案 (13) 5.2 实验心得 (14) 6. 用户使用说明 (16) 7. 参考文献 (16) 8. 附录1(源代码清单) (16) 9. 附录2(成绩评定表) (25) 1

1.前言 课程设计是实践性教学中的一个重要环节,它以某一课程为基础,它可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。《数据结构》是一门重要的专业基础课,是计算机理论和应用的核心基础课程。 在数据结构的学习和课程设计过程中,我发现它要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,都必须加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。对于我们专业来说,虽然说对技术要求不是特别高,但是在实际操作过程中,没有足够的专业知识对于编程来说是远远不可以达到要求的,所以对于这次的课程设计,我们必须要通过自己额外补充知识来完成它。 在这次的课程设计中我选择的题目是表达式的求值演示。它的基本要求是:以字符序列的形式从终端输入语法正确的,不含变量的表达式。利用算符优先关系,实现对算术四则混合运算表达式的求值,并演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们,同时加深对这种结构的理解和认识。对于表示出栈在每执行一个过程中都要输出它的变化,这点我认为在编程中是比较困难的,以我自身的能力,是不可能在规定的时间内完成任务的,所以我参考了很多有价值的书籍来帮助我完成我的程序设计。 2

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,

数据结构课程设计_表达式求值【完整版】

XXXXXX大学《数据结构》课程设计报告 班级: 学号: 姓名: 指导老师:

目录 一算术表达式求值 一、需求分析 二、程序的主要功能 三、程序运行平台 四、数据结构 五、算法及时间复杂度 六、测试用例 七、程序源代码 二感想体会与总结

算术表达式求值 一、需求分析 一个算术表达式是由操作数(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

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

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

C语言上机实验报告书 表达式求值实验报告

一.需求分析 设计一个程序,演示用算符优先法对算术表达式求值的过程。利用算符优先关系,实现对算术四则混合运算表达式的求值。 (1)输入的形式:表达式,例如2*(3+4) 包含的运算符只能有'+' 、'-' 、'*' 、'/' 、'('、 ')'; (2)输出的形式:运算结果,例如2*(3+4)=14; (3)程序所能达到的功能:对表达式求值并输出 二.系统设计 1.栈的抽象数据类型定义: ADT Stack{ 数据对象:D={ai|ai∈ElemSet,i=1,2,…,n,n≥0} 数据关系:R1={|ai-1,ai∈D,i=2,…,n} 约定an端为栈顶,ai端为栈底 基本操作: Push(&S,e) 初始条件:栈S已存在 操作结果:插入元素e为新的栈顶元素 Pop(&S,&e) 初始条件:栈S已存在且非空 操作结果:删除S的栈顶元素,并用e返回其值 }ADT Stack 2.主程序的流程: EvaluateExpression()函数实现了对表达式求值的功能,main()函数直接调用EvaluateExpression()对输入的表达式求值输出

3.各个模块的主要功能: *Push(SC *s,char c):把字符压栈 *Push(SF *s,float f):把数值压栈 *Pop(SC *s):把字符退栈 *Pop(SF *s):把数值退栈 Operate(a,theta,b):根据theta对a和b进行'+' 、'-' 、'*' 、'/' 、'^'操作 In(Test,*TestOp):若Test为运算符则返回true,否则返回false ReturnOpOrd(op,*TestOp):若Test为运算符,则返回此运算符在数组中的下标precede(Aop,Bop):根据运算符优先级表返回Aop与Bop之间的优先级EvaluateExpression(*MyExpression):用算符优先法对算术表达式求值 三.调试分析 (1)刚开始只编写了一个Push和一个Pop函数,但因为在EvacuateExpression()里既有运算符入/出栈,又有运算数入/出栈,运行下来总是出错。所以就编写了两个不同的Push和Pop函数,分别使用。 四.测试结果 2+3*4/5-1 输入表达式: 输入表达式:5*(10-2*3)-8

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

目录 1概述 (2) 1.1目的及意义 (2) 2系统分析 (2) 2.1需求分析 (2) 3概要设计 (2) 3.1系统总体结构 (2) 3.2程序算法图 (2) 4详细设计 (3) 4.1中缀表达式转换为后缀表达式 (3) 4.1.1求运算符优先级函数 (4) 4.1.2输出队列 (4) 4.2后缀表达式的求值 (4) 5运行与测试 (5) 5.1 输入表达式: (5) 5.2 输出结果: (5) 6总结和心得 (6) 6.1心得与问题 (6) 6.2总结 (6) 参考文献 (6)

1概述 1.1目的及意义 我们在很早的时候就开始学习书写及计算表达式,可以说运用起来很熟练了,但有时候并不想自己计算,交给计算器是时有的事,然而普通的计算器并不懂得优先级,给计算带来了一定的不便。 本程序实现的目的是将人们习惯的中缀表达式转换为计算机所能理解的后缀表达式以方便计算,最终得出我们所需要的正确的答案。 2系统分析 2.1需求分析 当我们需要进行一长串的计算时,各种运算符夹杂在一起,通过笔算很容易得出结果。然而计算机并没有人脑那么聪明,它并不懂得先乘除后加减,有括号要先计算括号里面的,它只知道从左到右的进行计算,这就造成了计算机计算的失误,科学的计算是人们非常需要的计算工具。 3概要设计 3.1系统总体结构 整个系统结构如图3-1-1所示,结构非常清楚,程序顺序执行,首先提示用户输入需要计算的表达式,经过转换得到后缀表达式,最后结果将数据显示到主屏幕上即可。 图3.1.1 系统总体结构图 3.2程序算法图 本程序所用的数据结构类型是栈和队列。

首先提示用户输入中缀表达式,再利用程序将中缀表达式转换为后缀表达式,其中数字入队列,算术运算符入栈。 图3.2.1 程序算法图 4详细设计 4.1中缀表达式转换为后缀表达式 将中缀表达式转换为后缀表达式首先需要扫描中缀表达式,当遇到数字时,将其入队列,当遇到运算符时,若是低优先级则直接入栈,若是高优先级则将低优先级运算符弹出,并入队列,再将此次运算符入栈,最终形成后缀表达式 图4.1.1后缀表达式的转换 其伪代码算法如下: switch(c){ case '0' to case '9' :EnQueue(Q,c) case '(': Push(S,c) case ')' to case'#': t=Pop(S); if (t!='(' && t!='#') EnQueue(Q,t); } while (t!='(' && S->top!=-1); case '+' || case '-'|| case '*'|| case '/': while (Priority(c)<=Priority(GetTop(S))) //比较优先级 EnQueue(Q, Pop(S)) Push(S,c) }

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

二课程设计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; } int Push(SqStack &s,char e) //运算符入栈 { if (s.top-s.base >= s.stacksize) { printf("运算符栈满!\n"); s.base=(char*)realloc (s.base,(s.stacksize+5)*sizeof(char) ); //栈满的时候,追加5个存储空间 if(!s.base) exit (OVERFLOW); s.top=s.base+s.stacksize; s.stacksize+=5; } *(s.top)++=e; //把e入栈 return OK; } int Pop(SqStack &s,char &e) //运算符出栈 { if (s.top==s.base) //栈为空栈的时候,返回ERROR { printf("运算符栈为空!\n"); return ERROR; } else {

c语言表达式题库

C语言程序设计表达式 一、表达式求值 1.表达式:!(4<=6)&&(3<=7) 的值为_______ 0 2.表达式:x=!(2<5==5) 的值为【1】1 3.如果有变量定义:int i=1,j=8,a;则表达式:a=i+(j%4!=0) 的值为_【1】1 4.表达式:x=(7+6)%4/2 的值为【1】0 5.如果有变量定义:int x,则表达式:x=-3*4%-6/50 的值为【1】0 6.如果有变量定义:int x ,则表达式:x=3+7%5-6 的值为【1】-1 7.如果有变量定义:int x,则表达式:x=-3+4/5-6 的值为【1】-9 8.如果有变量定义:int x=3,y=4,z=4则表达式:z>=y&&y>=x 的值为_____ 1 9.如果有变量定义:int x=3,y=4,z=4则表达式:(z>=y>=x)1:0 的值为____ 0 10.如果有变量定义:int x=0,y=0,z=0则表达式:k=++x&&++y||++z 的值为_____ 1 11. 如果有变量定义:int x=0,y=0,z=0则表达式:k=++x||++y&&++z 的值为______ 1 12. 如果有变量定义:int x=40,y=4,z=4则表达式:x=x==(y-z) 的值为____ 0 13.如果有变量定义:int a=15,则表达式:a=a<<1 的值为【1】30 14.如果有变量定义:int y;char x='a';则表达式:y='a'+1 的值为【1】98 15.如果有变量定义float x=,y=则表达式:xb a : c>d c : d 的值为 【1】 5 17.如果有变量定义:int a=1,b=3,m 则表达式:m=a>b a : b+1 的值为【1】4 18.如果有变量定义:int a=1,b=2则表达式:(!a)||(a>b) 的值为_______ 0 19. 如果有变量定义:int a=1,b=2,c=1,x=4,y=5则表达式:!a&&b||x>y&&c 的值为______ 0 20如果有变量定义:int a=12,n=5则表达式:a%=(n%=2) 的值为_______ 0 21如果有变量定义:int a=2, b=3;float x=, y=则表达式:(float)(a+b)/2+(int)x%(int)y 的值为【1】22如果有变量定义:int x=, y=则表达式:z=(int)x%(int)y 的值为【1】1 23如果有变量定义:int x=,a=7,y=则表达式:k=a%3*(x+y)/2 的值为【1】3 24如果有变量定义:int a=5则表达式:a*=1+3 的值为【1】20 25如果有变量定义:int a,b则表达式:b=(a=3*4, a*4),a+5 的值为【1】17 26如果有变量定义:int a,b 则表达式:x=a=3,5*a 的值为【1】15 27如果有变量定义:int a=120 则表达式:a%=(5%2) 的值为【1】0 28如果有变量定义:int a=10则表达式:a+=a-=a*=a 的值为【1】0 29 如果有变量定义:int a=10则表达式:a+=a-=a*a 的值为【1】-180 30 如果有变量定义:int i=3则表达式:j=i++ 的值为【1】3 31如果有变量定义:int i=3则表达式:j=++i 的值为【1】4 32表达式5&7的值为【1】,5│7的值为【2】. 5 7

数据结构课程设计算术表达式求值计算器.doc

高级语言程序设计 《算术表达式求值》 课程设计报告

算术表达式求值 系统可以实现实现对算术四则混合运算表达式求值,并打印求值过程中运算符栈、操作数栈的变化过程。 第二章系统分析 开始运行时界面如下: 你可以输入一个表达式,按E对其进行求值。

第四章系统实现 #include #include #include #include #define N 100 double numStack[N]={0};//操作数栈 int numTop; char opStack[N];//运算符栈 int opTop; void print_num(double str1[],int n) { int i; printf("\n操作数栈:\n"); for(i=0;i

if(ch=='+'||ch=='-') return 2; if(ch=='*'||ch=='/') return 3; if(ch=='(') return -1; return 0; } double result(double num1,char op,double num2)//计算 { if(op=='+') return num1+num2; if(op=='-') return num1-num2; if(op=='*') return num1*num2; if(op=='/') return num1/num2; return 0; } int compute(char str[]) { double num=0; int i=0,j=1,k=1; numTop=opTop=0; while(str[i]!='\0'||opTop>0) { if(str[i]>='0'&&str[i]<='9') num=num*10+str[i]-'0'; else if( k==1&&str[i]=='-'&&(i==0||op(str[i-1])) ) k=-1; else { if(i>0&&!op(str[i-1])&&str[i]!='('&&str[i-1]!=')')

相关文档
最新文档