表示式求解

2021-06-18 02:50:20 字數 1478 閱讀 9385

表示式求解是棧應用乙個典型的例子,其基本演算法思想為:

1.首先初始化1個運算數棧和1個運算子棧,運算子棧填入『=』表示棧空。

2.對輸入表示式進行逐字節解析,如果是運算元,則直接壓入運算數棧,如果是運算子則進行一下比較:

(1)如果棧頂運算子優先順序低於讀入運算子優先順序,則將運算子壓棧,繼續解析下面的位元組;

(2)如果是同級的運算子則直接出棧,說明是左括號,完成去括號工作;

(3)如果棧頂運算子優先順序高於讀入的運算子,則出棧兩個運算數和乙個運算子,計算結果,壓入運算數棧中。

3.當遇到'='則返回結果。

運算子比較遵循下面的規律:

1.同級運算子在棧內的運算子優先順序高於棧外運算子優先順序;

2.不同級運算子優先順序部分棧內棧外,按照算術運算規律確定;

3.左括號在棧外優先順序最高,在棧內優先順序最低,但優先順序和棧外右括號相同(進行去括號);

4.右括號在棧內優先順序都最高,棧外優先順序最低,在棧外時僅與棧內的左括號同級;

5.『=』在棧內優先順序最低。

演示**如下:

輸入(4+2)*3-15=回車即可求解。

//by kingdragonfly(仲夏的夢幻)

#include #include #include using namespace std;

int priority(char stackoptr,char optr);

void input(char *s);

int calc(int a,char o,int b);

int getresault(char *s);

stackoptr;

stackopnd;

void main()

res=getresault(s);

printf("%s%d\n",s,res); }}

int getresault(char *s)

if (flag ==1)

switch(priority(optr.top(),s[i]))

}res=opnd.top();

opnd.pop();

return res;

}int calc(int a,char o,int b)

return res;

}void input(char *s)

int priority(char stackoptr,char optr)

} else if (stackoptr == '-') }

else if (stackoptr == '*') }

else if (stackoptr == '/') }

else if (stackoptr == '(') }

else if (stackoptr == ')') }

else if (stackoptr == '=') }

else

return res;

}

表示式求解

構造包含頂指標,底指標和增量的結構體。然後分別構造乙個只包含運算子的棧 optr 和只包含數字的棧 opnd 之後依次讀入所輸入的表示式。判斷是不是數字,如果是數字就將數字放入數字棧 opnd 如果不是即運算子,讓運算子棧棧頂元素和讀入的運算子進行比較。如果優先順序小於將讀入的運算子入棧,優先順序相...

表示式求解

1 解題思路 構造包含頂指標,底指標和增量的結構體。然後分別構造乙個只包含運算子的棧 optr 和只包含數字的棧 opnd 之後依次讀入所輸入的表示式。判斷是不是數字,如果是數字就將數字放入數字棧 opnd 如果不是即運算子,讓運算子棧棧頂元素和讀入的運算子進行比較。如果優先順序小於將讀入的運算子入...

表示式求解程式

均已除錯通過,編譯器為dev c include include include include define stack size 100 char operator 7 用6出錯!int result,ch2 char opr 定義全域性變數 優先關係 char prioritytable 7 ...