思路:
所包含的運算子有『+』,『-』,『*』,『/』,『(』,『)』。
(1)建立兩個棧,乙個用來儲存運算元,另乙個用來儲存運算子, 開始時在運算子棧中先壓入『/0』,乙個表示式的結束符。
(2)然後從左至右依次讀取表示式中的各個符號(運算元或者運算子);
(3)如果讀到的是運算元直接存入運算元棧;
(4)如果讀到的是運算子,則作進一步判斷:
若讀到的是『/0』結束符,而且此時運算子棧的棧頂元素也是『/0』結束符,則運算結束,輸出運算元棧中的元素即為最後結果。
若讀到的是『(』或者讀到的運算子的優先順序比目前的運算子棧中的棧頂元素的優先順序高,則將運算子直接存入運算子棧,繼續讀表示式中的下乙個符號,重複步驟(3)和(4);
若讀到的是『)』,而且此時運算子棧的棧頂元素是『(』結束符,則將運算子棧中的棧頂元素退出來,繼續讀表示式中的下乙個符號,重複步驟(3)和(4);
若讀到的運算子的優先順序等於或小於之前的運算子的優先順序,則從運算元中退出2個,從運算子中退出乙個進行運算,將運算結果存入運算元棧;再把之前讀到的運算子與目前的運算子棧頂比較,重複步驟(4)(即現在不讀下乙個元素);
#include #include using namespace std;double tonum(char*s, int &k)
} else
k = k + 1;
} return x;
}int priority(char c)
return k;
}int main()
else if (c == '\0'&& sp.top() == '\0')
else if (c == '(' || (priority(c) > priority(sp.top())))
else if (c == ')'&& sp.top() == '(')
else if (priority(c) <= priority(sp.top()))
sv.push(y);
} c = s[k];
} cout << sv.top() << endl;
return 0;
}
c 結構體方式實現字尾表示式計算(資料結構)
功能 大致思路 整體思路 1.建棧 建立乙個空鏈棧,把數字型別放入棧中。2.入棧 需要乙個棧頭和準備入棧的數字。push t int 3.計算 從輸入中讀取資料,當遇到不是數字型別時,就從棧頂上往下取資料,取top data和 top next data 進行計算 4.出棧 計算完成之後把剛才計算的...
表示式 棧的實現 資料結構
這段 對一些讀入的非法資料判斷存在錯誤 比如像出現 a b 就無法判斷了 另外需要注意的是我覺得棧裡面儲存的是char型的,但是在運算元值的時候,會很不方便 還有一點在主函式裡面如果想用while來多次讀入資料的話,那麼你要考慮上一次輸入資料失敗後,那後面的字元該怎麼操作 上面出現的問題大家可以嘗試...
資料結構 棧實現表示式求值
expression.h calc expression 功能 利用棧實現整數表示式求值 輸入 表示式字串 輸出 求值結果 日期 2018 04 05 ifndef expression h define expression h include include include include 將中...