《演算法與資料結構 C語言描述》裡的求多項達式值

2021-07-26 07:07:44 字數 4049 閱讀 5438

在棧的應用裡,作者寫了將多項式值 ,但是描述的不是很清楚,露了乙個說明 。

從左到右讀取中綴表示式,依次乙個操作項.

如果是運算元直接進入輸出佇列.

讀到左括號時總是將它壓入棧中.

讀到右括號, 將最近棧頂的第乙個左括號上面的操作符全部依次彈出, 送至輸出佇列後, 再丟棄左括號.

當讀到操作符時,將棧中所有優先順序高於或等於當前操作符的操作符彈出,送到輸出佇列中.

中綴表示式全部讀完後,若棧中仍然有運算子,將其送到輸出佇列中

少了5,6的說明,但是從例子中也能看出來。一定要注意,遇到優先順序高於當前處理的操作符時,棧內高於或等於此優先順序的操作符逐一出棧,直到遇到小於此操作符的。

我寫了多項式求值的示例**。為了處理方便,將char** 用string來處理了。

棧資料結構的**

1 #ifndef linkstack_h

2#define linkstack_h

34 template

5class node

6 14 };

15 template

16class linkstack

17 22 ~linkstack()

25bool isemptystack_link()

30return

false;

31 }

32bool push_link(t data)

38 newnode->m_link = mtop;

39 mtop = newnode;

4041

return

true;

42 }

43 t pop_link()

51 mtop = p;

5253

return data;

54 }

55 }

56 t top_link()

63 }

64private:

65 node* mtop;

66 };

67#endif

多項式求值的**

1

: 定義控制台應用程式的入口點。2//

34 #include "

stdafx.h

"5 #include "

string.h

"6 #include

7 #include "

seqstack.h

"8 #include "

linkstack.h

"9 #include

10 #include

11using

namespace std;

12/*

13* 字首表示式轉字尾表示式

14*/

15int fixpost(char* src,string& ret,int len);

16bool isop(const

char* var); //

是否是操作符

17int result(string* des,int len); //

求字尾表示式的值(引數為已經轉成字尾表示式的字串)

18int getpriority(const

char* s); //

求某操作符對應的優先順序

19char g_op= ; //

儲存表示式

20int g_priority=; //

各個表示式的優先順序

21int divtoken(const

char* src,string* ret); //

將表示式以空格分隔

22int _tmain(int argc, _tchar* argv)

23 30

//for (int i = 0 ; i < 10 ; i++)

31//

34char* src = "

31 * ( 5 - 22 ) + 70

";35

string ret ;

36 fixpost(src,ret,strlen(src));

37 cout<38

string ss[10];

39int n = divtoken(ret.c_str(),ss);

40 cout<41 system("

pause

");42

return

0;43 }

44bool isop(const

char* var)

45 51

return

true;

52 }

53int divtoken(const

char* src,string* ret)

54 59

int j = 0;

60for (int i = 0 ; i < len; i++)

61

67 ret[j] += src[i];

68 }

6970

return j+1;

71 }

72int fixpost(char* src,string& ret ,int len)

73 77

78string str[30];

79int l = divtoken(src,str);

8081 linkstack stack;

82int j = 0;

8384

string temp = "";

85for (int i = 0; i < l; i++)

86

92else

103104 }

105 stack.pop_link();

106 }

107else

121 }

122 stack.push_link(str[i]);

123 }

124 }

125 }

126while (!stack.isemptystack_link())

127

131132

return

0;133 }

134int getpriority(const

char* s)

135

144 }

145if(index == -1)

148return g_priority[i];

149 }

150int result(string* des,int len)

151

166int res = 0;

167//

如果有反射就好了

168if(des[i] == "+")

171if(des[i] == "-")

174if(des[i] == "*")

177if(des[i] == "/")

179else

180 res = num1/num2;

181 }

182 stack.push_link(res);

183 }

184else

187 }

188 res = stack.pop_link();

189return res;

190 }

《演算法與資料結構 C語言描述》裡的農夫過河

題目 乙個農夫帶著乙隻狼,乙隻羊和一些菜過河。河邊只有一條船,由於船太小,只能裝下農夫和他的一樣東西。在無人看管的情況下,狼要吃羊,羊要吃菜,請問農夫如何才能使三樣東西平安過河。演算法的實質 在滿足一定條件下的,所有狀態的遍歷。滿足的條件 1.每次農夫必須移動 2.農夫移動的東西與農夫必須在同一岸,...

資料結構與演算法分析 C語言描述

第一種方法,先進行排序,再返回位置k上的元素。簡單排序問題 第二種方法,先將前k個元素讀入,再將剩下的元素逐個讀入,如果新元素大於陣列中第k個元素就找到他合適的位置並將陣列中的乙個元素擠出。第三種方法,利用快排的特點 假設預設公升序排序 每一次快排操作都能確定乙個數在排序結果中的最終固定位置,即該位...

資料結構與演算法分析 c 語言描述

編寫帶有下列宣告的兩個例程 void permute string str void permute char str,int low,int high 第乙個例程是個驅動程式,它呼叫第二個例程並顯示string str中字元的所有排列。例如,str是 abc 那麼輸出的串則是abc,acb,bac...