栈应用后缀表达式计算

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

后缀表达式计算

LinkStack.cpp

#include

using namespace std;

//单链表的结点结构体:

template

struct Node

{ DataType data;

Node *next;

};

//带头结点的单链表类的声明

template

class LinkStack

{ public:

LinkStack( ){ top=NULL; } //构造函数

~LinkStack( ); //析构函数

bool IsEmpty( ); //栈空操作

DataType GetTop ( ); //得到栈顶值操作

void Push( DataType x ); //进栈操作

DataType Pop( ); //出栈操作

private:

Node *top;

};

//析构函数,析构函数将单链表中所有结点的存储空间释放。template

LinkStack :: ~LinkStack( )

{ Node *q;

while (top !=NULL)

{ q = top; //暂存释放结点

top = top->next; //top指向被释放结点的下一个结点 delete q; //释放结点

}

cout<<"链表已经删除。"<

}

//栈空返回true,否则返回false

template

bool LinkStack::IsEmpty()

{ return (top==NULL)?true:false; };

//进栈操作

template

void LinkStack:: Push( DataType x )

{ Node *s;

s=new Node; //申请一个数据成为x的结点s s->data=x;

s->next=top;

top=s;

};

//出栈操作

template

DataType LinkStack::Pop( )

{ Node *p;

DataType x;

if (IsEmpty())

{ cout<< "栈空无值弹出" <data;

p=top;

top=top->next;

delete p;

return x;

};

//返回栈顶值操作

template

DataType LinkStack::GetTop( )

{ if (IsEmpty())

{ cout<< "栈空无值" <

exit(1);

}

return top->data;

};

PostExp.cpp

#include "LinkStack.h"

//后缀表达式计算的栈类声明

template

class PostExp

{ public:

PostExp( ){ } ; //构造函数

void Run( ); //执行表达式计算

void Clear( ); //清栈操作

private:

LinkStack s; //栈对象s

void Enter( DataType num); //进栈操作

bool In(char op); //判断操作数

bool GetTwoOperands(DataType& operand1,DataType& operand2); //从栈中推出两个操作数

void Compute(char op); //形成运算指令,进行计算

};

//进栈操作

template

void PostExp::Enter( DataType num)

{ s.Push(num); } //将操作数的值num进操作数栈

//从栈中推出两个操作数

template

bool PostExp::GetTwoOperands(DataType&

operand1,DataType& operand2)

{ if(s.IsEmpty()) //判断栈是否空

{ cout<< "缺少右操作数" <

operand1=s.Pop();

if(s.IsEmpty())

{ cout<< "缺少左操作数" <

operand2=s.Pop(); //去左操作数

return true;

}

相关文档
最新文档