C++栈实现将中缀表达式转换为后缀表达式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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()

相关文档
最新文档