中綴表示式轉字尾表示式演算法及實現

2021-06-19 07:01:56 字數 2296 閱讀 2773

1

23 #include 4

using

namespace std;

56 template class mystack

7 ;20

2122 template void mystack::init()

23 26

27 template bool mystack::empty()

28 31

32 template t mystack::gettop()

33 39

return

this->data[this->top-1];

40 }

4142 template void mystack::push(t x)

43 49

this->data[this->top] =x;

50this->top ++;

51 }

5253 template t mystack::pop()

54 60

61 t e =this->data[this->top-1];

62this->top --;

63return e;

64 }

//

prefixtopostfix.h

#include using

namespace std;

bool isoperator(char op); //

判斷是否為運算子

int priority(char op); //

求運算子優先順序

void postfix(char pre , char post,int &n); //

把中綴表示式轉換為字尾表示式

double read_number(char str,int *i); //

將數字字串轉變成相應的數字

double postfix_value(char post); //

由字尾表示式字串計算相應的中值表示式的值

//

prefixtopostfix.cpp

#include "

mystack.h

"#include "

prefixtopostfix.h

"#include using

namespace std;

void main()

bool isoperator(char op)

}int priority(char op)}//

把中綴表示式轉換為字尾表示式,返回字尾表示式的長度(包括空格)

void postfix(char pre ,char post,int &n)

else

if (pre[i]=='

(') //

遇到「(」不用比較直接入棧

stack.push(pre[i]);

else

if(pre[i] =='

)') //

遇到右括號將其對應左括號後的操作符(操作符棧中的)全部寫入字尾表示式

stack.pop(); //

將「(」出棧,字尾表示式中不含小括號

}else

if (isoperator(pre[i]))

stack.push(pre[i]); //

當前操作符優先順序大於棧頂操作符的優先順序,將該操作符入棧

}i++;

}while(stack.top) //

將所有的操作符加入字尾表示式

}double read_number(char str,int *i)

if(str[*i]=='

.') //

處理小數部分

字首 中綴 字尾表示式及中綴轉字尾表示式

字首表示式 不含括號的算術表示式,而且是將運算子寫在前面,運算元寫在後面的表示式。求法 首先從右往左掃瞄表示式,從右邊第乙個字元判斷,如果當前字元是數字,則一直到字串的末尾再記錄下來 如果是運算子,則將右邊最近的兩個數字串做相應的運算,以此作為乙個新串並記錄下來。一直掃瞄到最左端停止。例子 a b ...

中綴表示式轉字尾表示式

using system using system.collections.generic using system.text namespace 中綴表示式轉字尾表示式 class convert public void run top break case case while top 1 st...

中綴表示式轉字尾表示式

將乙個普通的中綴表示式轉換為字尾表示式的一般演算法是 首先需要分配2個棧,乙個作為臨時儲存運算子的棧s1 含乙個結束符號 乙個作為輸入字尾表示式的棧s2 空棧 s1棧可先放入優先順序最低的運算子 注意,中綴式應以此最低優先順序的運算子結束。可指定其他字元,不一定非 不可。從中綴式的左端開始取字元,逐...