表示式求解是棧應用乙個典型的例子,其基本演算法思想為:
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 ...