1. 程式人生 > >C++資料結構與STL--棧的應用--中綴表示式轉字尾表示式

C++資料結構與STL--棧的應用--中綴表示式轉字尾表示式

#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+

}