C语言、栈+表达式求值、 代码+论文

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if( !S.base )
exit ( -1 );
S.top = S.base + S.stacksize;//防止S.base地址可能变更的情况
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;//S.top赋值,然后自增,
returntrue;
}
boolPop ( Stack_S &S,int&e )//弹栈
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
}
boolGetTop ( Stack_S S,int&e )//获取栈顶元素
{
if( S.top == S.base )//栈空
returnfalse;
e = *(S.top - 1);
returntrue;
#include<ctype.h>
#include<math.h>
#defineSTACK_INIT_SIZE 100//栈初始化大小
#defineSTACKINCREMENT 10//增量
typedefstructTagStack
{
int*base;//栈底,栈构造前和销毁后,都为NULL
int*top;//栈顶。空栈时base==top;否则top永远指向栈顶元素的下一个位置
Pop ( OPTR, e ); //当‘=’时:e,c是括号则去掉(),接收下一个字符
c = getchar ( );
break;
case '>': //符号栈栈顶元素的优先级比输入运算符优先级高,退栈。将运算结果压栈
Pop ( OPTR, e );
Pop ( OPND, b ); //注意这两个的顺序,b与a不要搞反了,b先出栈a后出栈
}
boolPush ( Stack_S &S,inte )//入栈
{
if( (S.top - S.base) >= S.stacksize )//空间不够,重新分配
{
S.base = (int*)realloc ( S.base, (S.stacksize + STACKINCREMENT)*sizeof(int) );
{
if( S.top == S.base )
returnfalse;
e = *--S.top;//S.top先自减,再赋值
returntrue;
}
//判断符号优先级的函数。数据结构中表3.1写作的函数
intstacksize;//当前已经分配的存储空间
}Stack_S;//栈结构
voidInitStack ( Stack_S &S )//空间初始分配
{
S.base = (int*)malloc ( STACK_INIT_SIZE*sizeof(int) );
if( !S.base )
exit ( -1 );
}
GetTop ( OPND, e ); //获取最后结果
return e; //返回结果
}
2.3 程序演示:
系统测试
计算结果:
结 论
这一次的课程设计相比之前的几次算是比较简单和轻松的了,但是还是会有很多问题出现,主要问题体现在对C语言的遗忘,有些东西不记得了,需要看以前的学习的书再次巩固一下。
本次实践做了两个题,一个是线性表的链式表示和实现,另一个是利用栈实现表达式求解。在做线性表的时候对指针的使用还不是很好,容易出错,在同学及老师的帮助下,顺利解决。在做利用栈实现表达式求解问题的时候,对栈的理解必须到位才可以做好,特别是表达式求解时什么时候进栈什么时候出栈是很重要的,匹配括号是其中一个难点。
r = '<';
else
r = '>';
break;
百度文库case '*':
case '/':
if ( optr1 == '*' || optr1 == '/' || optr1 == ')' )
r = '>';
else
r = '<';
break;
case '(':
if ( optr1 == ')' )
{
比如输入一个字符串:12+56/7*65=遇到数字就继续向后读取,直到遇到运算符,将这前面的数字入栈,然后在+号这里,程序判断+号和运算符栈顶的运算符优先级,因为运算符栈初始化是有一个最低级运算符=,所以+号优先级大于=号,这里就将+号也入运算符栈。然后继续读取数字,将独到的的数字56后入运算数栈,这里/号运算符优先级大于刚入栈的+号。所以/号也继续入预算符栈。数字7入运算数栈,后面的*号和运算数栈顶的/号同优先级,所以这里程序先不把*号入栈,进行出栈计算函数操作。由于运算数栈栈顶和栈顶下一个数据,就是/号运算符的2个运算数,所以将运算数栈出栈2次,运算符栈出栈一次,得到56/7,进行计算,将得到的结果8进行运算数入栈操作,然后在执行*号和运算符栈顶进行比较,*号优先级大于+号,入运算符栈,并且读取数字65,入运算数栈,最后读取的=号优先级小于所有运算符,所以进行出栈运算操作,同样是运算数栈出栈2次,而运算符栈出栈一次,得到8*65.计算后入运算数栈。栈计算函数进行递归判断,=号优先级继续小于第一次入栈的+号,在执行出栈运算,知道运算符栈也只有最先初始化的=号运算符结束。
1977年Dennis M.Ritchie 发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。
1978年Brian W.Kernighian和Dennis M.Ritchie出版了名著《The C Programming Language》,从而使C语言成为目前世界上流行最广泛的高级程序设计语言。
第二个实验是利用栈实现表达式求解,要求只考虑+、-、*、/四种数学运算还有只考虑圆括号参与运算。
关键词:数据结构与算法 线性表 链式结构 栈 表达式求解
1引 言
1.1问题的提出
数据结构课程设计是重要地实践性教学环节。在进行了程序设计语言课和 《数据结构与算法》课程教学的基础上,设计实现相关的数据结构经典问题,有助于加深对数据结构课程的认识。本课程设计是数据结构中的一个关于线性表链式表示的实现还有用栈实现表达式求解,此课程设计要求对栈存储结构和链表存储结构非常熟悉,并能熟练使用它们。
1.2C语言
C语言既有高级语言的特点,又具有汇编语言的特点;既是一个成功的系统设计语言,有时一个使用的程序设计语言;既能用来编写不依赖计算机硬件的应用程序,又能用来编写各种系统程序;是一种受欢迎、应用广泛的程序设计语言。
1.3C语言发展过程
1973年,美国贝尔实验室的D.M.RITCHIE在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。
getche ( );
exit ( -1 );
}
}
}
计算表达式:
int computeExpression ( ) //运算表达式的函数
{
Stack_S OPTR, OPND; //OPTR为运算符栈;OPND为运算数栈
char c;
char Data[11];
memset ( Data, 0, 11 ); //数组归零
{
Data[i] = c;
i++;
c = getchar ( );
}
//Data[i] = '0';
d = atoi ( Data );//字符串转化为整数
Push ( OPND, d ); //数字压入操作数栈
}
else
{
puts ( "输入错误" );
exit ( -1 );
}
GetTop ( OPTR, e ); //获取操作符栈的栈顶元素
数学与计算机学院
课程设计说明书
课 程 名 称:数据结构与算法A设计实践
课 程 代 码:6015059
题 目 二:利用栈实现表达式求解
年级/专业/班:2011/信科/
学 生 姓 名:彭X
学 号:312011070102XXX
开 始 时 间:2014年5月28日
完 成 时 间:2014年6月28日
课程设计成绩:
学习态度及平时成绩(30)
技术水平与实际能力(20)
创新(5)
说明书撰写质量(45)
总 分(100)
指导教师签名:年月日
3实验二…………………………………………………………………………9
3.1整体设计思路………………………………………………………………9
3.2 编码…………………………………………………………………………10
经过本次课程设计,相当于复习了C语言和数据结构,也锻炼了程序设计的能力,收获颇多。
附录
Cpp:
//栈实现数值计算.cpp:主项目文件。
#include"stdafx.h"
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
Pop ( OPND, a );
Push ( OPND, compute ( a, e, b ) );
break;
}
}
else if ( (c >= '0') && (c <= '9') )//当读到的是数字
{
int i = 0;
while ( (c >= '0') && (c <= '9') )//循环读出多位的数字
puts ( "括号匹配错误" );
exit ( -1 );
}
else
r = '<';
break;
case ')':
if ( optr1 == '(' )
r = '=';
else if ( optr1 == '=' )
{
puts ( "没有左括号" );
}
else
r = '>';
break;
case '=':
switch ( optr1 )
{
case'=':
r = '=';
break;
case'(':
puts ( "没有右括号!!" );
exit ( -1 );
default:
r = '>';
}
break;
}
return r;
}
计算函数:
int compute ( int a, int Opera, int b )//,运算函数
1.4任务
题目二:利用栈实现表达式求解
第二个实验是使用栈来解决表达式中的求解优先问题。要求(1)只考虑+、-、*、/四种数学运算;(2)只考虑圆括号( )参与运算。
3 实验二 利用栈实现表达式求解
2.1整体设计思路
基本的思路是,程序根据输入的字符,来分析求解步骤,然后根绝步骤以此计算求解。我用符号来表示运算符和运算符的优先级,通过运算符的优先级来决定是进行运算还是入栈。
{
char n = (char)Opera;
switch ( n )
{
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a*b;
case '/':
if ( b != 0 )
return a / b;
else
{
puts ( "除数不能为0!" );
{
if ( isSign ( c ) ) //是符号则进栈
{
switch ( compare ( e, c ) ) //符号e的优先级高于c时返回'>'
{
case '<': //符号栈栈顶的元素优先级低,压栈
Push ( OPTR, c );
c = getchar ( );
break;
case '=':
3.2 编码:
比较优先级:
char compare ( char optr1, char optr2 ) //optr1为前一个运算符,optr2为后一个运算符
{
char r;
switch ( optr2 )
{
case '+':
case '-':
if ( optr1 == '(' || optr1 == '=' )
int a, b, d, e;
InitStack ( OPTR );
InitStack ( OPND );
Push ( OPTR, '=' ); //操作符栈中首先插入‘=’
c = getchar ( );
GetTop ( OPTR, e ); //取操作符栈的栈顶元素
while ( (c != '=') || (e != '=') )
3.3 程序演示……………………………………………………………………13
总结………………………………………………………………………………15
参考文献…………………………………………………………………………16
摘要
随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,数据结构与算法的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。数据结构与算法旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。
相关文档
最新文档