設計一個有getMin功能的棧
使用C++完成《程式設計師程式碼面試指南 IT名企演算法與資料結構題目》
題目
實現一個特殊的棧,在實現棧的基本功能基礎上,再實現返回棧中最小元素的操作
實現
使用兩個棧,一個棧用來儲存當前棧中的元素,起功能和一個正常的棧沒有區別,這個棧記為stackData;另一個棧用於儲存每一步的最小值,這個棧記為stackMin
1. 第一種方案
壓入資料規則:
假設當前資料為newNum,先將其壓入stackData,然後判斷stackMin是否為空:
- 如果為空,則newNum壓入stackMin
- 如果不為空,則比較newNum和stackMin的棧頂元素中哪一個更小
- 如果newNum更小或者兩者相等,則newNum也壓入stackMin
- 如果stackMin中棧頂元素小,則stackMin不壓入任何內容
彈出資料規則
- 先在stackData中彈出棧頂元素,記為value。然後比較當前stackMin的棧頂元素和value哪一個更小
- 當value等於stackMin的棧頂元素時,stackMin彈出棧頂元素
- 當value大於stackMin的棧頂元素時,stackMin不彈出棧頂元素:返回value
getMin操作(查詢當前棧中的最小值操作)
由於stackMin始終記錄著stackData中的最小值,所以,stackMin的棧頂元素始終是當前stackData中的最小值
方案1實現程式碼
class MyStack1{
private:
stack <int>stackData;
stack <int>stackMin;
public:
MyStack1(){}
void push(int newNum){
if(stackMin.empty()){
stackMin.push(newNum);
}else if (newNum <= getmin()){
stackMin.push(newNum);
}
stackData.push(newNum);
}
int pop(){
if(stackData.empty()){
fprintf(stderr, "The stcack is empty\n");
exit(0);
}
int value = stackData.top();
stackData.pop();
if(value == getmin()){
stackMin.pop();
}
return value;
}
int getmin(){
if(stackMin.empty()){
fprintf(stderr,"Your Stack is empty");
exit(0);
}
return stackMin.top();
}
};
2. 第二種方案
壓入資料規則
- 假設當前資料為newNum,先將其壓入stackData,然後判斷stackMin是否為空:
- 如果為空,則newNum也壓入stackMin
- 如果不為空,則比較newNum和stackMin的棧頂元素中哪一個更小:
- 如果newNum更小或兩者相等,則newNum也壓入stackMin
- 如果stackMin中棧頂元素小,則把stackMin的棧頂元素重複壓入stackMin
彈出資料規則
- 在stackData中彈出資料,彈出的資料記為value;
- 彈出stackMin中的棧頂;
- 返回value
getMin操作(查詢當前棧中最小值操作)
由於stackMin始終記錄著stackData中的最小值,所以,stackMin的棧頂元素即為當前stackData中的最小值
方案2實現程式碼
class MyStack2{
private:
stack <int>stackData;
stack <int>stackMin;
public:
MyStack2(){}
void push(int newNum){
if(stackMin.empty()){
stackMin.push(newNum);
}else if (newNum<getmin()){
stackMin.push(newNum);
}else{
int newMin = stackMin.top();
stackMin.push(newMin);
}
stackData.push(newNum);
}
int pop(){
if(stackData.empty()){
fprintf(stderr,"The stack is empty");
exit(0);
}
stackMin.pop();
int popNum=stackData.top();
stackData.pop();
return popNum;
}
int getmin(){
if(stackMin.empty()){
fprintf(stderr, "Your stack is empty");
exit(0);
}
return stackMin.top();
}
};
第一種方案在stackMin的棧頂只存放當前stackData裡的最小值一次,而第二種方案每次在壓入和彈出stackData棧時都要壓入和彈出stackMin中資料,向stackMin棧中重複壓入當前stackData裡的最小值
相關文章
- 設計一個有 getMin 功能的棧
- 常見面試演算法題JS實現-設計一個有getMin功能的棧面試演算法JS
- 有始有終,設計一個結構合理的下載模組
- 數學,離一個程式設計師有多近?程式設計師
- 程式設計師如何能把一個功能說的工作量很大?程式設計師
- 設計包含min函式的棧函式
- Linkedlist的應用場景:設計佇列、設計棧佇列
- 做一個有產品思維的研發:邏輯設計
- 做一個有產品思維的研發:庫表設計
- 當一個java程式設計師到底有多難Java程式設計師
- 產品的功能設計
- 有前(錢)途的程式設計師的14個習慣,你有幾個?程式設計師
- Vue的第一個元件設計Vue元件
- 【介面功能設計】TopThink介面功能設計建議
- Java全棧程式設計師之01:做個Linux下的程式猿Java全棧程式設計師Linux
- 每到一個階段,都會有一個最火的程式設計師職位,目前就是前端!程式設計師前端
- 新Rust程式設計師需要學習的9個功能Rust程式設計師
- PHP歷理 做一個計算24點的功能PHP
- 併發程式設計 棧幀程式設計
- 介面設計方法 — 3. 字典功能的設計
- 【系統設計】設計一個限流元件元件
- 聊聊如何實現一個帶有攔截器功能的SPI
- 高效設計一個LRU
- 設計一個可靠的連線池
- 如何設計一個良好的API介面?API
- 《Web全棧實用程式設計》一書徵集意見Web全棧程式設計
- 找回密碼的功能設計密碼
- 如何構建一個沒有任何後端程式碼的全棧應用?- hashnode後端全棧
- 搭建我的第一個Docker應用棧Docker
- 面試了一個 39 歲程式設計師,我有點慌……面試程式設計師
- 設計一個基於svg的塗鴉元件(一)SVG元件
- 一個程式設計師的編年史程式設計師
- 如何設計一個牛逼的API介面API
- 一個理想主義的程式設計師程式設計師
- 一個程式設計師眼中的 UCAN 2019程式設計師
- 一個BAT老程式設計師的忠告!BAT程式設計師
- 如何做出一個好的設計方案
- 設計一個簡單的devops系統dev