利用栈实现表达式求解
本课程设计是数据结构中的一个关于用栈实现表达式求解,栈是计算机中常用的一种数据结构,具有广泛的使用。利用栈的性质及其操作原理编写一个使用栈计算表达式的程序有助于更好的掌握栈的使用规则和原理应用。
1.2 C语言
C语言既有高级语言的特点,又具有汇编语言的特点;既是一个成功的系统设计语言,有时一个使用的程序设计语言;既能用来编写不依赖计算机硬件的应用程序,又能用来编写各种系统程序;是一种受欢迎、应用广泛的程序设计语言。
1.4任务与分析
本程序用于解决一个可以带括号的表达式求值的问题,要运用到栈,而且会用到一种简单直观,广为使用的算法,通常称为“算符优先法”。进行表达式求值首先要了解算术四则运算的规则。即:(1)先乘除,后加减;(2)从左算到右;(3)先括号内后括号外;算符优先法根据这个算符优先关系的规定来实现对表达式的编译或解释执行的。任何一个表达式都是由操作数、运算符和界限符组成。
/*'('*/'<','<','<','<','<','=',' ',
/*')'*/'>','>','>','>',' ','>','>',
/*'#'*/'<','<','<','<','<',' ','=',
};
//==========对两操作数进行运算
floatOperate(floata,unsignedchartheta,floatb)
{
// 算术表达式求值的算符优先算法。
// 设OPTR和OPND分别为运算符栈和运算数栈,OPSET为运算符集合。
栈是一种重要的线性结构,栈可以用作数制转换、括号匹配的检验、行编辑程序等等问题中。从数据结构角度看,栈也是线性表,其特殊性在于栈的基本操作是线性表操作的子集,它是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,它是和线性表大不相同的两类重要的抽象数据类型。
栈实限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶,相应地,表头端称为栈底。不含元素的空表称为空栈。栈又称为后进先出的线性表。
printf("\n");
printf ("运算结果是:%d\n", nResult );
printf("\n");
break;
case0:
exit(0);
break;
}
}
return0;
}
3.4
//==========预定义
#defineok 1
#defineerror 0
#defineoverflow -1
这次的课程设计是利用栈实现表达式求解,要求只考虑+、-、*、/四种数学运算还有只考虑圆括号参与运算。
关键词:数据结构与算法, 栈, 表达式求解,最优
1.1问题的提出
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
cout<<"请输入选项:";
cin>>n;
switch(n)
{
case1:
puts ("**************************************************");
puts ("请输入一个运算式,以#结尾:");
printf("\n");
nResult = EvaluateExpression();
理学院
课程设计说明书
课 程 名 称:数据结构与算法A设计实践
课 程 代 码:6015059
题 目 二:利用栈实现表达式求解
开 始 时 间:2015年12月28日
完 成 时 间:2016年01月10日
课程设计成绩:
学习态度及平时成绩(30)
技术水平与实际能力(20)
创新(5)
说明书撰写质量(45)
总 分(100)
EvaluateExpression():用运算符优先级对算术表达式求值
最后,通过主函数对以上几个函数的调用,实现该系统的功能。
2.2 数据需求
输入一个表达式,利用优先级表对表达式求值。
3
3.1
为了实现算符优先算法使用两个工作栈,一个称作OPTR,以寄存运算符;另一个称作OPND,用以寄存操作数或运算结果。在操作数和操作符入栈前,通过一个函数来判别,输入的是操作数还是操作符,操作数入OPND,操作符入OPTR。在输入表达式的最后输入‘#’,设定‘#’的优先级最低,代表表达式输入结束。在表达式输入过程中,遇操作数则直接入栈,遇到运算符则与栈顶运算符比较优先级,若当前运算符优先级高,则当前运算符入栈,扫描下一符号;否则栈顶运算符出栈,两操作数出栈,进行运算,所得结果入数栈,重新比较当前运算符与新栈顶运算符。如此重复直到栈顶运算符与当前符号均为‘#’,运算结束。
(2)只考虑圆括号()参与运算
测试数据及测试结果请在上交的资料中写明;必须上机调试通过
按《数据结构课程设计大纲》中的要求完成课程设计报告格式。
设计结束后,每个学生必须上交的材料有:
1《课程设计报告》打印稿一份2.课程设计的源代码电子文档一份
四、主要技术路线提示
根据运算符号的优先级来决定当前符号是否入栈;注意考虑多重括号匹配的问题。
2 系统分析
2.1功能要求
2.1.1 总体要求
利用教材3.2.5节的理论实现表达式求解。
(1)只考虑+、-、*、/四种数学运算
(2)只考虑圆括号()参与运算
2.1.2本人所做模块
根据这次课程设计题目的要求,将这次任务分为了几个小的模块,具体模块的功能如下:
Push(&S,e):入栈函数模块
Pop(&S,&e):出栈函数模块
}
*S.top++=e;
returnok;
}
//===========出栈函数模板
template<typenameT1,typenameT2>
Status Pop(T1 &S,T2 &e)
{
if(S.top==S.base)
returnerror;
e=*--S.top;
returnok;
}
//===========获取栈顶元素模板
exit (overflow);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnok;
}
//==========入栈函数模板
template<typenameT1,typenameT2>
Status Push(T1 &S,T2 e)
{
if(S.top-S.base>=S.stacksize)
2.严蔚敏等著,《数据结构》,清华大学出版社,2003
3.李芸芳等著,《软件技术基础》(第二版),清华大学出版社,2000
4.徐孝凯等著,《数据结构(C语言描述)》,清华大学出版社,2004
指导教师签名日期年月日
系 主 任审核日期年月日
摘
随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,数据结构与算法的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。数据结构与算法旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。
In(Test,* TestOp):判断是否为运算符
Operate(a,theta,b):根据theta对a、b进行四则运算操作
ReturnOpOrd(op,* TestOp):若TestOp为运算符,则返回此运算符在数组的下标
precede( Aop, Bop):根据运算符优先级表返回Aop与Bop之间的优先级
{
boolFind=false;
for(inti=0; i< OPSETSIZE; i++)
{
if(Test == TestOp[i])
Find=true;
}
returnFind;
}
//===========比较运算符间的优先关系
unsignedcharPrior[7][7] =
{
// 运算符优先级表
#defineOPSETSIZE 7
#defineSTACKINCREMENT 100
#defineSTACK_INIT_SIZE 10
//==========定义顺序栈结构模板
template<typenameT>
structSqStack
{
T *top;
T *base;
intstacksize;
{
switch(theta)
{
case'+':returna+b;
case'-':returna-b;
case'*':returna*b;