C語言 C 棧和佇列

2021-06-22 05:22:07 字數 4059 閱讀 7025

①數制轉換:

將乙個非負的十進位制整數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 //

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 }

1、問題敘述 

假設在週末舞會上,男士們和女士們進入舞廳時,各自排成一隊。跳舞開始時,依次從男隊和女隊的隊頭上各出一人配成舞伴。若兩隊初始人數不相同,則較長的那一隊中未配對者,等待下一輪舞曲。現要求寫一演算法模擬上述舞伴配對問題。 

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...