在棧的應用裡,作者寫了將多項式值 ,但是描述的不是很清楚,露了乙個說明 。
從左到右讀取中綴表示式,依次乙個操作項.
如果是運算元直接進入輸出佇列.
讀到左括號時總是將它壓入棧中.
讀到右括號, 將最近棧頂的第乙個左括號上面的操作符全部依次彈出, 送至輸出佇列後, 再丟棄左括號.
當讀到操作符時,將棧中所有優先順序高於或等於當前操作符的操作符彈出,送到輸出佇列中.
中綴表示式全部讀完後,若棧中仍然有運算子,將其送到輸出佇列中
少了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...