C++栈实现将中缀表达式转换为后缀表达式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5 将中缀表达式转换为后缀表达式
【问题描述】表达式转换。输入的中缀表达式为字符串,转换得到的后缀表达式存入字符数组中并输出。
例如:a*(x+y)/(b-x) 转换后得:a x y + * b x - /
【数据结构】
●定义一个暂时存放运算符的转换工作栈opst。
●中缀表达式字符串char *infix;
●后缀表达式字符串char *postfix;
【算法提示】转换规则:把运算符移到它的两个操作数后面,删除掉所有的括号。
从头到尾扫描中缀表达式,对不同类型的字符按不同情况处理:
●数字或小数点,直接写入字符串postfix,并在每个数值后面写入一个空格;
●左括号,进栈,直到遇见相配的右括号,才出栈;
●右括号,表明已扫描过括号内的中缀表达式,把从栈顶直到对应左括号之间的运算
符依次退栈,并把结果推入栈内;
●对于运算符,分两种情况处理:
◆该运算符的优先级大于栈顶符号的优先级,则入栈;
◆若该运算符的优先级小于栈顶优先级,则先弹出栈顶运算符、写入postfix串;继续将该
运算符与栈顶运算符比较,直到能把它推入栈内为止(即优先级大于栈顶运算符)。
说明:自行设计运算符优先级的表示。
【主要代码】
#include
#include
//#include
const int stackIncreament=20;
class SeqStack
{
private:
char *elements;
int top;
int maxSize;
void overflowProcess();
public:
SeqStack(int sz=50);
~SeqStack()
{ delete []elements; }
void Push(const char &x);
bool Pop(char &x);
bool getTop(char &x);
int isdigit(char ch);
int isp(char ch1);
int icp(char ch2);
bool IsEmpty() const
{ return (top == -1)? true:false; }
bool IsFull() const
{ return (top == maxSize-1)? true:false; }
int getSize() const { return top+1; }
void MakeEmpty() { top= -1; }
};
SeqStack::SeqStack(int sz)
{ top = -1; maxSize = sz; elements = new char[maxSize];
assert(elements!=NULL);
}
void SeqStack::overflowProcess()
{ char*newArray=new char[maxSize+stackIncreament];
/* if (newArray==NULL)
{
cerr<<"存储分配失败!"< exit(1); }*/ for (int i = 0; i <= top; i++) newArray[i] = elements[i]; maxSize= maxSize+stackIncreament; delete []elements; elements = newArray; } void SeqStack::Push(const char &x) { if (IsFull()==true) overflowProcess(); elements[++top]=x; } bool SeqStack::Pop(char &x) { if (IsEmpty() == true) return false; x = elements[top--]; return true; } bool SeqStack::getTop(char &x) { if (IsEmpty()==true) return false; x=elements[top]; return true; } int SeqStack::isdigit(char ch) { if(ch>='0'&&ch<='9'||ch=='.'||ch>='a'&&ch<='z'||ch>='A'&&ch<='Z') return 1; e lse return 0; } int SeqStack::isp(char ch1) { int val; switch(ch1) { case '#': val=0; break; case '(': val=1; break; case '*': case '/': case '%': val=5; break; case '+': case '-': val=3; break; case ')': val=6; break; } return val; } int SeqStack::icp(char ch2) { int val; switch(ch2) { case '#': val=0; break; case '(': val=6; break; case '*': case '/': case '%': val=4; break; case '+': case '-': val=2; break; case ')': val=1; break; } return val; } class Show:public SeqStack { public: Show(int sz):opst(sz){} void Clear(); void Postfix();void Input();void Output(); private: SeqStack opst; char *infix; char *postfix; }; void Show::Clear() { opst.MakeEmpty(); } void Show::Input()