字尾表示式又稱逆波蘭表示式,明顯的特點是:逆波蘭表示式中沒有括號,計算時將操作符之前的第乙個數作為右運算元,第二個數作為左運算元,進行計算,得到的值繼續放入逆波蘭表示式中。
但日常生活中我們總是習慣於寫中綴表示式,所以需要先將中綴表示式轉為字尾表示式。
假如中綴表示式為:12*(3+4)-6+8/2
在遇到數字時,我們直接輸出,遇到符號,則入棧。但在入棧時,我們要判斷棧內已有的操作符的優先順序和需要判斷的操作符的優先順序的大小。
棧內《棧外:入棧操作符
棧內》棧外:出棧操作符
棧內=棧外:出棧 棧內的操作符併入棧 棧外的操作,
遇到 『(』:直接入棧
遇到 『)』:出棧所有操作符直達遇到 『(』
因為第乙個操作符進入時也需要比較,所以在建立出儲存操作符的棧時,直接就入棧乙個』#』,別的字元也行,只要是非操作符就行,並將其優先順序設為」1」,其他操作設為更低的」-1」。
優先順序:
0–>』#』;
1–>』(『;
2–>』+』;
2–>』-『;
3–>』*』;
3–>』/』;
4–>』)』;
其他情況下優先順序均為』-1』。但是我們在判斷優先順序時,因為』(『的優先順序為』1』,比較小,所以判斷時要先判斷是否為』(『,是的話直接入棧,我們可以用if,else if,else完成。
具體**實現如下:
#include
#include
#include
using
namespace
std;
bool number(char ch)//判斷是否為數字,是則返回true
void input(char*& str)//接收輸入的中綴表示式的函式,並簡單判斷是否合法
else
}}int getpriority(char sy)//設定各個操作符的優先順序
}void addspace(char*& arr)//給轉成的字尾表示式的數字和符號新增空格,區分每個字元
char* getback()//獲取字尾表示式的函式
else
if (*middle == ')')//如果右括號的話,輸出所有操作符直到遇到左括號,並拋棄相對應的一堆括號
middle++;
s.pop();//拋棄左括號
}else
if (*middle == '(')//遇到左括號,則進入棧
else
if (getpriority(*middle) > getpriority(s.top()))//如果棧內的操作符優先順序高於棧外的優先順序,則入棧
else
if (getpriority(*middle) <= getpriority(s.top()))
//如果棧內的操作符優先順序低於或等於棧外的優先順序,輸出棧內的符號,併入棧棧外的符號}}
while (s.top() != '#')//中綴表示式遍歷完成,但是=棧中還有符號存在,一一出棧輸出
*back = '\0';
cout
<< "the back is: "
<< backend << endl;
return backend;
}double getnumber(char*& arr)
; int i = 0; double result = 0;
while (*arr != ' ')
int k = i - 1;
for (int j = 0; j < i; j++,k--)
return result;
}double cauculate(char ch, double left, double right)//各個操作符對應的操作
}double countback(char* back)
else
if (*back == ' ')
else
}while (s.size() >= 2)//最終棧內存在的數大於2時,繼續計算,直到只剩下乙個數
//返回這個數字,既是最終結果
return s.top();
}void funtest()
中綴表示式轉字尾表示式,並求值
資料結構之棧的應用 先實現求值這一步吧,已知字尾表示式 轉換這一環節待更新 上 中綴表示式轉字尾表示式 seqstack 以及求值 version 1.0 求值,需要自己輸入字尾表示式 2.0 加上轉化功能 演算法 建立乙個運算元棧,自左向右遍歷字尾表示式,遇到乙個運算元就入棧,遇到乙個操作符就從棧...
中綴表示式轉字尾表示式並計算字尾表示式的值
中綴表示式轉字尾表示式思路 首先給用到的每個操作符如 等按照他們原本的計算優先順序定義兩個代表優先順序的數值,如instackpri代表入棧之後的優先順序,outstackpri代表入棧之前的優先順序.然後掃瞄表示式,如果是數字,直接輸出,如果是 則將棧頂操作符依次出棧,直到遇到 如果是其他操作符,...
中綴表示式轉字尾表示式
using system using system.collections.generic using system.text namespace 中綴表示式轉字尾表示式 class convert public void run top break case case while top 1 st...