009 資料結構與演算法 棧與佇列演算法題集訓 1

2021-10-05 23:29:17 字數 2883 閱讀 6922

目錄

數進製的轉換

每日溫度

括號匹配檢驗(位元組面試題)

將10進製的數n轉為8進製

思路1. 初始化乙個空棧s

2. 當十進位制n非零時,迴圈執行以下操作

* 把n與8求餘得到的八進位制數壓入棧s;

* n更新為n與8的商;

3. 當棧s非空時,迴圈執行以下操作

* 彈出棧頂元素e;

* 輸出e;

void conversion(int n)

//3.

while (!stackempty(s))

}

問題解讀:

實際上就是找當前元素 從[i,tsize] 找到大於該元素時. 數了幾次. 首先最後乙個元素預設是0,因為它後面已經沒有元素了

方法1(暴力法)

思路:1.建立乙個result 結果陣列.

2.預設reslut[tsize-1] = 0;

3.從0個元素遍歷到最後乙個元素[0,tsize-1];

a.如果當前i >0 並且當前的元素和上乙個元素相等,則沒有必要繼續迴圈(因為值一樣,後面比它大的次數已經拿到了). 則判斷一下result[i-1]是否等於0,如果等於則直接將result[i] = 0,否則將result[i] = result[i-1]-1;

b.遍歷元素[i+1,tsize]

如果當前t[j]>t[i],則result[i] = j-i;

如果當前t[j]已經是最後乙個元素,則預設result[i] = 0;

實現:

int  *dailytemperatures_1(int* t, int tsize, int* returnsize)

if (j == tsize-1) }}

return result;

}

方法2:跳躍法(暴力法基礎上優化)

跳躍對比:

1. 從右到左遍歷. 因為最後一天的氣溫不會再公升高,預設等於0;

2. i 從[tsize-2,0]; 從倒數第二天開始遍歷比較. 每次減一;

3. j 從[i+1,tsize]遍歷, j+=result[j],可以利用已經有結果的位置進行跳躍,從而減少遍歷次數

-若t[i]-若reuslt[j] == 0,則表示後面不會有更大的值,那麼當前值就應該也是0;

思路:1.建立乙個result 結果陣列.

2.預設reslut[tsize-1] = 0;

3.從tsize-2個元素遍歷到第乙個元素[tsize-2,0];

4.從[i+1,tsize]遍歷,j+=result[j];

-若t[i]-若reuslt[j] == 0,則表示後面不會有更大的值,那麼當前值就應該也是0;

實現:

int  *dailytemperatures_2(int* t, int tsize, int* returnsize)else}}

}return result;

}

方法3:利用棧的思想來解決問題

首先它的資料是線性的,來會比較大小,所以它可以用棧的思想來解決,這裡注意,棧可以解決它,但不一定是最優的方法

最後的結果是來回比較值在陣列中索引的差,我們將索引放到棧中,判斷值 小於入棧,大於出棧

思路:1. 初始化乙個棧(用來儲存索引),value陣列

2. 棧中儲存的是元素的索引值index;

3. 遍歷整個溫度陣列從[0,tsize];

(1).如果棧頂元素《當前元素,則將當前元素索引index-棧頂元素index,計算完畢則將當前棧頂元素移除,將當前元素索引index 儲存到棧中; 出棧後,只要棧不為空.繼續比較,直到棧頂元素不能滿足t[i] > t[stack_index[top-1]]

(2).如果當前的棧為空,則直接入棧;

(3).如果當前的元素小於棧頂元素,則入棧

(4).while迴圈結束後,當前元素也需要入棧;

實現:

int* dailytemperatures_3(int* t, int tsize, int* returnsize) 

// 當前元素入棧。

stack_index[top] = i;

printf("i= %d; stackindex[%d] = %d ",i,top,stack_index[top]);

top++;

printf(" top = %d \n",top);

}return result;

}

假設表示式中允許包含兩種括號:圓括號與⽅括號,其巢狀順序隨意,即(()) 或者[()]都是正確 的.⽽這[(]或者(()])或者([()) 都是不正確的格式.例如,考慮以下括號的判斷: [ ( [ ] [ ] ) ]

思路:1. 將第0個元素壓棧

2. 遍歷[1,strlen(data)]

(3). 取棧頂字元

(4). 檢查該字元是左括號("(","[")

a.是左"(",則判斷緊接其後的data[i]是為右")"

yes->壓棧,no->出棧

b.是左"[",則判斷緊跟其後的data[i]是為右"]"

yes->壓棧,no->出棧

c.表示式如果以"#"結尾,則判斷緊跟其後的data是為左"(""]"

yes->壓棧,no->-1;

3.遍歷結束,則判斷棧是否為空,為空則表示匹配成功;否則匹配失敗;

**實現:

int executedata(sqstack stack,char* data)

else

}

資料結構與演算法(棧與佇列)

棧 stack 有些地方稱為堆疊,是一種容器,可存入資料元素 訪問元素 刪除元素,他的特點在於只能允許在容器的一端 稱為棧頂端指標,英語top 進行加入資料 英語push 和輸出資料 英語pop 的運算。沒有了位置概念,保證任何時候可以訪問 刪除的元素都是此前最後存入的那個元素,確定了一種預設的訪問...

佇列 棧(資料結構與演算法)

佇列是一種先進先出 fifo 的資料結構,從隊尾進,從隊頭出 在 fifo 資料結構中,將首先處理新增到佇列中的第乙個元素。如上圖所示,佇列是典型的 fifo 資料結構。插入 insert 操作也稱作入隊 enqueue 新元素始終被新增在佇列的末尾。刪除 delete 操作也被稱為出隊 deque...

資料結構與演算法分析 棧與佇列

以下是對資料結構中的棧和佇列的一些總結 一 棧 棧 stack 是一種特殊的線性表,有後進先出 last in first out,lifo 的性質,且只能從線性表的一段進行插入和刪除元素等操作。棧的常用操作有 進棧 出棧 取棧頂 將棧置空 判斷棧是否為空 判斷棧是否已滿等等。由於棧也屬於線性表,因...