目錄
數進製的轉換
每日溫度
括號匹配檢驗(位元組面試題)
將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 的性質,且只能從線性表的一段進行插入和刪除元素等操作。棧的常用操作有 進棧 出棧 取棧頂 將棧置空 判斷棧是否為空 判斷棧是否已滿等等。由於棧也屬於線性表,因...