- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用栈的方式实现表达式求值
一、程序设计任务
掌握栈的用法,实现表达式求值这一栈的典型应用问题:以字符序列的形式从终端输入语法正确的、不含变量的算术表达式,利用算符优先关系,实现对算术四则混合运算表达式求值。当用户输入一个合法的表达式后,能够返回正确的结果。能够计算的运算符包括:加、减、乘、除、括号 。
二、具体代码实现如下
#includeiostream.h
#includefstream.h
#includestring.h
#includestdlib.h
#includemath.h
#includecstdio //cstdio本来就只是将stdio.h的内容用C++的头文件形式表现出来。
#define NULL 0
typedef struct node //定义一个结点结构体
{
char date;
struct node *next;
}SNode;
SNode *InitStack()//初始化空链栈
{
SNode *top;
top=new SNode;//top=(SNode *)malloc(sizeof(SNode));
top-next=NULL;
return top;
}
void PushOptr(SNode *top,char x)//运算符进栈函数
{
SNode *p;
p=new SNode;
p-date=x;
p-next=top-next;
top-next=p;
}
char PopOptr(SNode *top)//运算符出栈函数
{
SNode *p;
char x;
if(top==NULL)
return NULL;
p=top-next;
x=p-date;
top-next=p-next;
delete p;
return x;
}
void PushOpnd(SNode *top,char x)//操作数进栈函数
{
SNode *p;
p=new SNode;
p-date=x;
p-next=top-next;
top-next=p;
}
char PopOpnd(SNode *top)//操作数出栈函数
{
SNode *p;
char x;
if(top==NULL)
return NULL;
p=top-next;
x=p-date;
top-next=p-next;
delete p;
return x;
}
char GetTop(SNode *top)//取栈顶元素
{
return (top-next)-date;
}
int In(char c)
{
int n;
switch(c)
{
case +:
case -:
case *:
case /:
case (:
case ):
case %:
case ^:
case #: n=1;break;
default : n=0;break;
}
return n;
}
char Precede(char x,char y) //符号优先级规则说明
{
int i,j;
int form[9][9]=
{
{1,1,-1,-1,-1,1,-1,-1,1},
{1,1,-1,-1,-1,1,-1,-1,1},
{1,1,1,1,-1,1,1,-1,1},
{1,1,1,1,-1,1,1,-1,1},
{-1,-1,-1,-1,-1,0,-1,-1,2},
{1,1,1,1,2,1,1,1,1},
{1,1,1,1,-1,1,1,-1,1},
{1,1,1,1,-1,1,1,1,1},
{-1,-1,-1,-1,-1,2,-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;
case ):i=5;break;
case %:i=6;break;
case ^:i=7;break;
case #:i=8;break;
}
switch(y)
{
case +:j=0;break;
case -:j=1;break;
case *:j=2;break;
case /:j=3;break;
case (:j=
文档评论(0)