輸入乙個含括號的加減乘除表示式,輸出該表示式的值:
思路:輸入表示式,注意(可能帶有括號),運用兩個棧,符號棧和數字棧,首先判斷優先順序,把所有符號的優先順序打表,進行運算,入棧時模仿單調棧,如果當前 優先順序比棧頂元素優先順序小,說明當前元素需要趕快計算,不然會影響以後的結果。例如2*3-2,『-』進來的時候,優先順序比』*』小,所以先把*運算執行完,執行完之後再把減號放進來。如果遇到優先順序相等的情況即()的情況,就把現在括號內的都清空。另外我們可以在 字串 前面後面都加乙個#,防止最後計算不完的情況。
解釋一下為什麼 ,新來的優先順序要比棧頂元素的優先順序高
看一下這個例子:
2*3+1 當來到'+'時,這時候加號的優先順序比棧頂元素'*'底,說明前面的計算必須要完成了,要不然會出錯。
然後注意括號 棧頂元素 括號 的優先順序 要比 新來括號的優先順序低,要讓他入棧。
ac:
#includeconst int maxn=1000250;
using namespace std;
typedef long long ll;
struct num
int empty()
void push(int x)
void pop()
int top()
}st;
struct oper
int empty()
void push(char x)
void pop()
char top()
}op;
char str[maxn];
int p[10][10]=,,,
,,,,
};int creatmap(char a)
}int cmp(char a,char b)// a是棧頂元素
int cal(int a,int b,char ch)
}void solve()
i--;//不滿足的時候多加了1
st.push(x);
} else
else if(cmp(op.top(),str[i])==1)
}if(str[i]!='#'&&str[i]!=')') op.push(str[i]);}}
} printf("%d\n",st.top());
}int main()
/***
7-6*(2/1+2)
***/
執行結果:
優先順序表參照:《資料結構》 宋麗華 張小峰老師著
資料結構 中綴表示式求值解法
簡述中綴表示式的做題思想 例如 輸入乙個表示式為 3 2 5 3 1 3 4 2 定義兩個棧,乙個是操作符棧 sdoc 乙個是運算元棧 sdop 1.首先判斷輸入的字元是數還是操作符 如果是運算元 char cinch int x while cinch getchar n 此處是輸入函式並且不為回...
中綴表示式求值
中綴表示式用於計算乙個表示式,比如計算器 就是這樣實現的 這兒是用棧的資料結構來實現的。首先輸入乙個字串,表示乙個表示式,然後用乙個棧儲存數字,另外乙個棧儲存符號 如果當前運算子優先順序比棧頂元素優先順序高,則入棧,若當前運算子優先順序小於等於棧頂運算子優先順序,則從數字棧中彈出兩個元素,從符號棧中...
中綴表示式求值
表示式求值都需要2個棧。乙個是符號棧,另乙個是數字棧。拿上面的字尾式45 來說,咱們剛才將表示式從4 5轉換到45 的過程是咱們一眼就能看出來的,但是計算機不能像咱們這樣做,因為他不會。他只會從表示式的開頭,順序掃瞄表示式的每乙個字元,它不能像咱們一樣 一眼就 看 出來。計算機是如何轉換的呢?1.從...