C++資料結構與STL--棧的應用--中綴表示式轉字尾表示式
阿新 • • 發佈:2019-01-03
#ifndef in_post_convert_H
#define in_post_convert_H
#include<string>
#include<stack>
#include"op_priority.h"
using std::string;
using std::stack;
class in_post_convert
{
private:
string inExpr; //中綴表示式
string postExpr; //字尾表示式
stack<op_priority> opStack;//操作符棧
bool isDigt(char c) //判斷字元是否為數字
{
return c>='0'&&c<='9';
}
bool isOperator(char c) //判斷字元是否為操作符
{
return c=='+'||c=='-'||c=='*'||
c=='/'||c=='%'||c=='^';
}
void popHeigherEqual(op_priority op)
{
op_priority tem;
while(!opStack.empty()&&(tem=opStack.top())>=op) //把所有棧操作符的優先順序大於輸入優先順序的操作符出棧
{
postExpr+=tem.getOperator();
opStack.pop();
}
}
public:
in_post_convert(string exp):inExpr(exp) //建構函式,初始化中綴表示式
{
}
string post() //把中綴表示式轉換成字尾表示式
{
for(int i=0;i<inExpr.length();i++) //從左往右掃描中綴表示式
{
char ch=inExpr[i];
if(isDigt(ch)) //如果是數字,直接寫入字尾表示式
{
postExpr+=ch;
}
else if(isOperator(ch)||ch=='(') //處理操作符和'('
{
op_priority op(ch);
popHeigherEqual(op); //把符合要求的操作符出棧
opStack.push(op); //把當前操作符進棧
}
else if(ch==')') //處理')'
{
op_priority op(ch);
popHeigherEqual(op); //把符合要求的操作符出棧
opStack.pop(); //'('出棧
}
}
while(!opStack.empty()) //把剩餘操作符出棧
{
op_priority tem=opStack.top();
postExpr+=tem.getOperator();
opStack.pop();
}
return postExpr;
}
};
#endif
測試程式:
#include<iostream>
#include"in_post_convert.h"
using std::cout;
using std::endl;
int main()
{
string res;
in_post_convert expr(string("3*(4-2^5)+6"));
res=expr.post();
cout<<res<<endl; //3425^-*6+
}
#define in_post_convert_H
#include<string>
#include<stack>
#include"op_priority.h"
using std::string;
using std::stack;
class in_post_convert
{
private:
string inExpr; //中綴表示式
string postExpr; //字尾表示式
stack<op_priority> opStack;//操作符棧
bool isDigt(char c) //判斷字元是否為數字
{
return c>='0'&&c<='9';
}
bool isOperator(char c) //判斷字元是否為操作符
{
return c=='+'||c=='-'||c=='*'||
c=='/'||c=='%'||c=='^';
}
void popHeigherEqual(op_priority op)
{
op_priority tem;
while(!opStack.empty()&&(tem=opStack.top())>=op) //把所有棧操作符的優先順序大於輸入優先順序的操作符出棧
{
postExpr+=tem.getOperator();
opStack.pop();
}
}
public:
in_post_convert(string exp):inExpr(exp) //建構函式,初始化中綴表示式
{
}
string post() //把中綴表示式轉換成字尾表示式
{
for(int i=0;i<inExpr.length();i++) //從左往右掃描中綴表示式
{
char ch=inExpr[i];
if(isDigt(ch)) //如果是數字,直接寫入字尾表示式
{
postExpr+=ch;
}
else if(isOperator(ch)||ch=='(')
{
op_priority op(ch);
popHeigherEqual(op); //把符合要求的操作符出棧
opStack.push(op); //把當前操作符進棧
}
else if(ch==')') //處理')'
{
op_priority op(ch);
popHeigherEqual(op); //把符合要求的操作符出棧
opStack.pop(); //'('出棧
}
}
while(!opStack.empty()) //把剩餘操作符出棧
{
op_priority tem=opStack.top();
postExpr+=tem.getOperator();
opStack.pop();
}
return postExpr;
}
};
#endif
測試程式:
#include<iostream>
#include"in_post_convert.h"
using std::cout;
using std::endl;
int main()
{
string res;
in_post_convert expr(string("3*(4-2^5)+6"));
res=expr.post();
cout<<res<<endl; //3425^-*6+
}