①數制轉換:
將乙個非負的十進位制整數n轉換為另乙個等價的基為b的b進製數的問題,很容易通過"除b取餘法"來解決。
【例】將十進位制數13轉化為二進位制數。
解答:按除2取餘法,得到的餘數依次是1、0、1、1,則十進位制數轉化為二進位制數為1101。
分析:由於 最先得到 的餘數是轉化結果的 最低位 ,最後得到的餘數是轉化結果的最高位,因此很容易用棧來解決。
具體演算法如下:
1 #include //表示式求值是程式語言編譯中的乙個最基本的問題。我們討論一種簡單直觀的方法「演算法優先順序法」c++中使用棧要包含的標頭檔案
2using
namespace std;//
這個也是要加的34
void conversion(int n,int b)
5 13
while(!s.empty())//
棧非空時退棧輸出
14
18 }
1920
int main()
21
算術四則運算的規則 :
1、從左到右
2、先乘除後加減
3、先括號內,後括號外
相繼出現的兩個運算子優先順序如下圖:
【例】4 + 2*3 -10/5 每一步的計算順序應該是:
4 + 2*3 -10/5 = 4 + 6 - 10/5 = 10 - 10/5 = 10 - 2 = 8
演算法步驟 :(我們假設表示式以字元『#』結尾)
(1)首先,建立空運算子棧optr,將表示式起始符『#』壓入棧底,建立空運算元棧opnd
(2)依次讀入表示式中的每個字元,若是運算元則進運算元棧,若是運算子則和運算子棧頂的運算子比較優先順序後,做如下相應操作:
1.如果棧頂的運算子優先順序較低,則把新的運算子壓入optr;執行(2)
2.如果棧頂的運算子優先順序較高,則將其 和 運算元棧的兩個棧頂元素 退棧,計算3個元素組成的表示式的值,再壓入運算元棧,然後繼續判斷;
3.如果棧頂的運算子優先順序相等(除了#符外,只有『(』和『)』是相等的),則將『(』出棧;執行(2)
(3)直到整個表示式求值完畢(即optr棧頂元素和當前讀入的字元均為『#』)
具體演算法實現:
1 #include 2 #include //1、問題敘述c++中使用棧要包含的標頭檔案34
using
namespace std;56
//符號陣列
7char symbol[7] = ; 89
//棧內元素的優先順序
10int
in[7] = ;
1112
//棧外元素的優先順序
13int
out[7] = ;
1415
/*16
* 通過符號字元獲取它的陣列下標
17*/
18int
get(char c)
19
39 }
4041
/*42
* 比較棧內運算子c1和棧外運算子c2的優先順序
43*/
44char precede(char c1, char c2)
45
53else
if(in[i1] < out[i2])
54
57else
58
61 }
6263
/*64
* 計算基本表示式的值
65*/
66int figure(int a, int theta, int b)
67
79 }
8081
/*82
* 計算表示式的值
83*/
84int evaluateexpression(const
char *exp)
85
98if('
+' == *exp)
99
102else
if('
-' == *exp)
103
107108
int index = optr.top(); //
獲取運算子棧頂元素在陣列的下標號
109while(*exp || symbol[index] != '
#') //
如果棧頂元素是'#'且當前元素為空結束計算
110
119if (!flag) //
如果是負數
120
123 opnd.push(sum);
124 flag = 1;
125 }
126else
127
145break;
146case'=
' :
147 optr.pop();
148if(*exp)
149
152break;
153 }
154 }
155 index = optr.top();
156 }
157return opnd.top();
158 }
159160
int main()
161 ;
163 cout << "
請輸入乙個表示式:
";164 cin.getline(c,50);
165 cout << evaluateexpression(c) << endl;
166167
return
0;
168 }
假設在週末舞會上,男士們和女士們進入舞廳時,各自排成一隊。跳舞開始時,依次從男隊和女隊的隊頭上各出一人配成舞伴。若兩隊初始人數不相同,則較長的那一隊中未配對者,等待下一輪舞曲。現要求寫一演算法模擬上述舞伴配對問題。
2、問題分析
先入隊的男士或女士亦先出隊配成舞伴。因此該問題具體有典型的先進先出特性,可用佇列作為演算法的資料結構。
在演算法中,假設男士和女士的記錄存放在乙個陣列中作為輸入,然後依次掃瞄該陣列的各元素,並根據性別來決定是進入男隊還是女隊。當這兩個佇列構造完成之後,依次將兩隊當前的隊頭元素出隊來配成舞伴,直至某佇列變空為止。此時,若某隊仍有等待配對者,演算法輸出此佇列中等待者的人數及排在隊頭的等待者的名字,他(或她)將是下一輪舞曲開始時第乙個可獲得舞伴的人。
3、具體演算法及相關的型別定義
1 #include "background-color: inherit; font-family: 微軟雅黑;
">//
c++中使用佇列要包含的標頭檔案23
4using
namespace std;
5 typedef struct
6 person;
1011
void dancepartner(person dancer,int num)
12 25 printf("
the dancing partners are: \n \n
");26
while(!(fdancers.empty()||mdancers.empty()))
27
37if(!fdancers.empty())
38
43else
if(!mdancers.empty())
44
49else
50
53 }//
dancerpartners
5455
int main()
56 ,,,};
58 dancepartner(p,4);
59 }
C語言 棧和佇列
什麼是棧,棧有什麼特性?棧,一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素的操作.進行資料插入和刪除的一端稱為棧頂,另一端稱為棧底.插入的操作稱為入棧 進棧 壓棧,刪除操作稱為出棧,插入和刪除的操作都在棧頂.棧中的資料遵循後進先出原則 last in first out 用c語言實現乙個動...
c 棧和佇列
c 棧 include using std stack s.empty 如果棧為空返回1,否則返回0 s.size 返回棧中元素的個數 s.pop 刪除棧頂元素但不返回其值 s.top 返回棧頂的元素,但不刪除該元素 s.push 在棧頂壓入新元素 測試例項 include include usin...
c 棧和佇列
使用標準庫的棧和佇列時,先包含相關的標頭檔案 include include 定義棧如下 stackstk 定義佇列如下 queueq 棧提供了如下的操作 cpp view plain copy s.empty 如果棧為空返回 true,否則返回 false s.size 返回棧中元素的個數 s.p...