C++后缀表达式.docx
- 文档编号:12368302
- 上传时间:2023-04-18
- 格式:DOCX
- 页数:18
- 大小:18.43KB
C++后缀表达式.docx
《C++后缀表达式.docx》由会员分享,可在线阅读,更多相关《C++后缀表达式.docx(18页珍藏版)》请在冰豆网上搜索。
C++后缀表达式
#include
#include
#include
enumStatusCode{SUCCESS,FAIL,UNDER_FLOW,OVER_FLOW,RANGE_ERROR,DUPLICATE_ERROR,
NOT_PRESENT,ENTRY_INSERTED,ENTRY_FOUND,VISITED,UNVISITED};
//--------------------------------------------------------------------------------------------------
//数据成员是double的结点类
structNode1
{
doubledata;//数据域
Node1*next;//指针域
Node1();//无参数的构造函数
Node1(doubleitem,Node1*link=NULL);//已知数数据元素值和指针建立结构
};
//数据成员是double的结点类的实现部分
Node1:
:
Node1()
//操作结果:
构造指针域为空的结点
{
next=NULL;
}
Node1:
:
Node1(doubleitem,Node1*link)
//操作结果:
构造一个数据域为item和指针域为link的结点
{
data=item;
next=link;
}
//--------------------------------------------------------------------------------------------------
//数据成员是char的结点类
structNode2
{
chardata;//数据域
Node2*next;//指针域
Node2();//无参数的构造函数
Node2(charitem,Node2*link=NULL);//已知数数据元素值和指针建立结构
};
//数据成员是char的结点类的实现部分
Node2:
:
Node2()
//操作结果:
构造指针域为空的结点
{
next=NULL;
}
Node2:
:
Node2(charitem,Node2*link)
//操作结果:
构造一个数据域为item和指针域为link的结点
{
data=item;
next=link;
}
//--------------------------------------------------------------------------------------------------
//由结点1(数据成员是double类型的)构成的链栈类
classLinkStack1
{
protected:
//链栈实现的数据成员:
Node1*top;//栈顶指针
//辅助函数
voidInit();//初始化栈
public:
//抽象数据类型方法声明及重载编译系统默认方法声明:
LinkStack1();//无参数的构造函数
virtual~LinkStack1();//析构函数
intLength()const;//求栈长度
boolEmpty()const;//判断栈是否为空
voidClear();//将栈清空
StatusCodePush(constdouble&e);//入栈
StatusCodeTop(double&e)const;//返回栈顶元素
StatusCodePop(double&e);//出栈
};
//由结点1(数据成员是double类型的)构成的链栈类的实现部分
voidLinkStack1:
:
Init()
//操作结果:
初始化栈
{
top=NULL;//构造栈顶指针
}
LinkStack1:
:
LinkStack1()
//操作结果:
构造一个空栈表
{
Init();
}
LinkStack1:
:
~LinkStack1()
//操作结果:
销毁栈
{
Clear();
}
intLinkStack1:
:
Length()const
//操作结果:
返回栈元素个数
{
intcount=0;//计数器
for(Node1*tmpPtr=top;tmpPtr!
=NULL;tmpPtr=tmpPtr->next)
{//用tmpPtr依次指向每个元素
count++;//对栈每个元素进行计数
}
returncount;
}
boolLinkStack1:
:
Empty()const
//操作结果:
如栈为空,则返回true,否则返回false
{
returntop==NULL;
}
voidLinkStack1:
:
Clear()
//操作结果:
清空栈
{
doubletmpElem;//临时元素值
while(!
Empty())
Pop(tmpElem);
}
StatusCodeLinkStack1:
:
Push(constdouble&e)
//操作结果:
将元素e追加到栈顶,如成功则返加SUCCESS,否则如动态内存已耗尽
//将返回OVER_FLOW
{
Node1*new_top=newNode1(e,top);
if(new_top==NULL)
{//动态内存耗尽
returnOVER_FLOW;
}
else
{//操作成功
top=new_top;
returnSUCCESS;
}
}
StatusCodeLinkStack1:
:
Top(double&e)const
//操作结果:
如栈非空,用e返回栈顶元素,函数返回SUCCESS,否则函数返回UNDER_FLOW
{
if(Empty())
{//栈空
returnUNDER_FLOW;
}
else
{//栈非空,操作成功
e=top->data;//用e返回栈顶元素
returnSUCCESS;
}
}
StatusCodeLinkStack1:
:
Pop(double&e)
//操作结果:
如栈非空,删除栈顶元素,并用e返回栈顶元素,函数返回SUCCESS,否则
//函数返回UNDER_FLOW
{
if(Empty())
{//栈空
returnUNDER_FLOW;
}
else
{//操作成功
Node1*old_top=top;//旧栈顶
e=old_top->data;//用e返回栈顶元素
top=old_top->next;//top指向新栈顶
deleteold_top;//删除旧栈顶
returnSUCCESS;
}
}
//--------------------------------------------------------------------------------------------------
//由结点2(数据成员是char类型的)构成的链栈类
classLinkStack2
{
protected:
Node2*top;//栈顶指针
voidInit();//初始化栈
public:
LinkStack2();//无参数的构造函数
virtual~LinkStack2();//析构函数
intLength()const;//求栈长度
boolEmpty()const;//判断栈是否为空
voidClear();//将栈清空
StatusCodePush(constchar&e);//入栈
StatusCodeTop(char&e)const;//返回栈顶元素
StatusCodePop(char&e);//出栈
};
//由结点2(数据成员是char类型的)构成的链栈类的实现部分
voidLinkStack2:
:
Init()
{
top=NULL;
}
LinkStack2:
:
LinkStack2()
{
Init();
}
LinkStack2:
:
~LinkStack2()
{
Clear();
}
intLinkStack2:
:
Length()const
{
intcount=0;
for(Node2*tmpPtr=top;tmpPtr!
=NULL;tmpPtr=tmpPtr->next)
{
count++;
}
returncount;
}
boolLinkStack2:
:
Empty()const
{
returntop==NULL;
}
voidLinkStack2:
:
Clear()
{
chartmpElem;
while(!
Empty())
Pop(tmpElem);
}
StatusCodeLinkStack2:
:
Push(constchar&e)
{
Node2*new_top=newNode2(e,top);
if(new_top==NULL)
{
returnOVER_FLOW;
}
else
{
top=new_top;
returnSUCCESS;
}
}
StatusCodeLinkStack2:
:
Top(char&e)const
{
if(Empty())
{
returnUNDER_FLOW;
}
else
{
e=top->data;
returnSUCCESS;
}
}
StatusCodeLinkStack2:
:
Pop(char&e)
{
if(Empty())
{
returnUNDER_FLOW;
}
else
{
Node2*old_top=top;
e=old_top->data;
top=old_top->next;
deleteold_top;
returnSUCCESS;
}
}
//--------------------------------------------------------------------------------------------------
//表达式求值类
classExpressionValue
{
private:
//辅助函数:
staticboolIsOperator(charch);//判断ch是否为运算符
staticintLeftPri(charop);//左边运算符的优先级
staticintRightPri(charop);//右边运算符的优先级
staticvoidGet2Operands(LinkStack1&opnd,double&a1,double&a2);
//从opnd栈中取出两个操作数
staticvoidDoOperator(LinkStack1&opnd,constdouble&a1,charop,constdouble&a2);
//形成运算指令(a1)op(a2),结果进opnd栈
staticvoidPostfixExpression(ofstream&outFile);
//将从键盘中输入的中缀表达式转换为后缀表达式,再存入输出流文件outFile中
staticvoidPostfixExpressionValue(ifstream&inFile);
//从输入文件inFile中输入后缀表达式,并求后缀表达式的值
public:
//接口方法声明:
ExpressionValue(){};//无参数的构造函数
virtual~ExpressionValue(){};//析构函数
staticvoidRun();//求从键盘输入的中缀表达式之值
};
//表达式求值类的实现部分
boolExpressionValue:
:
IsOperator(charch)
//操作结果:
如果ch是运算符,则返回true,否则返回false
{
if(ch=='='||ch=='('||ch=='*'||ch=='/'||ch=='+'||ch=='-'||ch==')')returntrue;
elsereturnfalse;
}
intExpressionValue:
:
LeftPri(charop)
//操作结果:
左边运算符的优先级
{
intresult;//优先级
if(op=='=')result=0;
elseif(op=='(')result=1;
elseif(op=='*'||op=='/')result=5;
elseif(op=='+'||op=='-')result=3;
elseif(op==')')result=6;
returnresult;//返回优先级
}
intExpressionValue:
:
RightPri(charop)
//操作结果:
右边运算符的优先级
{
intresult;//优先级
if(op=='=')result=0;
elseif(op=='(')result=6;
elseif(op=='*'||op=='/')result=4;
elseif(op=='+'||op=='-')result=2;
elseif(op==')')result=1;
returnresult;//返回优先级
}
voidExpressionValue:
:
Get2Operands(LinkStack1&opnd,double&a1,double&a2)
//操作结果:
从opnd栈中取出两个操作数
{
if(opnd.Pop(a2)==UNDER_FLOW)cout<<"表达式有错!
";//抛出异常
if(opnd.Pop(a1)==UNDER_FLOW)cout<<"表达式有错!
";//抛出异常
}
voidExpressionValue:
:
DoOperator(LinkStack1&opnd,constdouble&a1,charop,constdouble&a2)
//操作结果:
形成运算指令(a1)op(a2),结果进opnd栈
{
switch(op)
{
case'+':
opnd.Push(a1+a2);//加法+运算
break;
case'-':
opnd.Push(a1-a2);//减法-运算
break;
case'*':
opnd.Push(a1*a2);//乘法*运算
break;
case'/':
if(a2==0)cout<<"除数为0!
";
opnd.Push(a1/a2);//除法/运算
break;
}
}
voidExpressionValue:
:
PostfixExpression(ofstream&outFile)
//操作结果:
将从键盘中输入的中缀表达式转换为后缀表达式,再存入输出流文件outFile中
{
LinkStack2optr;//操作符栈optr
charch,optrTop,op;//输入的字符ch,操作符栈optr栈顶操作符,操作符op
doubleoperand;//操作数
optr.Push('=');//为编程方便起见,在optr的栈底压入'='
optr.Top(optrTop);//取出操作符栈optr的栈顶
cin>>ch;//从输入流读一个字符
while(optrTop!
='='||ch!
='=')
{//当optrTop等于'='且ch等于'='不成立时,表达式运算未结束
if(isdigit(ch)||ch=='.')
{//ch为数字或句点时的处理
cin.putback(ch);//将ch放回输入流
cin>>operand;//读操作数operand
outFile< cin>>ch;//从输入流读一个字符 } elseif(! IsOperator(ch)) {//ch为非法字符 cout<<"非法字符! "; return; } else { if(LeftPri(optrTop) { optr.Push(ch);//ch进optr栈 cin>>ch;//从输入流读一个字符 } elseif(LeftPri(optrTop)>RightPri(ch)) { optr.Pop(op);//从optr栈退出op outFile< } elseif(LeftPri(optrTop)==RightPri(ch)&&ch==')') {//表示optrTop等于'('与ch等于')' optr.Pop(ch);//从optr栈退出栈顶的'(' cin>>ch;//从输入流读一个字符 } } optr.Top(optrTop);//取出操作符栈optr的栈顶 } outFile<<'=';//输入流文件outFile以'='结束,以便编程实现 } voidExpressionValue: : PostfixExpressionValue(ifstream&inFile) //操作结果: 从输入文件inFile中输入后缀表达式,并求后缀表达式的值 { LinkStack1opnd;//操作数栈opnd charch;//当前字符 doubleoperand;//操作数 while(inFile>>ch,ch! ='=') {//只要从输入流文件inFile取得的字符不为'='就循环 if(IsOperator(ch)) {//ch为操作符,进行相关运算 doublea1,a2;//操作数 Get2Operands(opnd,a1,a2);//从opnd栈中取出两个操作数 DoOperator(opnd,a1,ch,a2);//形成运算指令(a1)op(a2),结果进opnd栈 } else {//ch不是操作符 inFile.putback(ch);//将ch放回输入流文件inFile inFile>>operand;//从输入流文件inFile输入操作数 opnd.Push(operand);//将operand入栈opnd } } opnd.Top(operand);//取得opnd的栈顶元素作为表达式运算结果 cout< } voidExpressionValue: : Run() //操作结果: 求从键盘输入的中缀表达式之值 { ofstreamoutFile("temp.dat");//定义输出流文件 PostfixExpression(outFile); //将从键盘所输入的中缀表达式转换为后缀表达式,将结果存入输出流文件中(以'='结束) outFile.close();//关闭输出流文件 ifstreaminFile("temp.dat");//定义输入流文件 PostfixExpressionValue(inFile); //计算从输入流文件中输入的后缀表达式(以'='结束)的,并将结果在屏幕上显示出来 inFile.close();//关闭输入流文件 } //-------------------------------------------------------------------------------------------------- intmain(void) { charbYes; do { cout<<"输入表达式: "< ExpressionValue: : Run(); cout<<"是否继续";
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C++ 后缀 表达式
![提示](https://static.bdocx.com/images/bang_tan.gif)