設計一個有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 功能的棧
- 設計一個有getMin功能的棧(1)
- 設計一個有getMin功能的棧(2)
- 常見面試演算法題JS實現-設計一個有getMin功能的棧面試演算法JS
- 用一個棧實現另一個棧的排序排序
- 程式設計是一個沒有前途的工作程式設計
- 一個程式設計師的運氣有多重要程式設計師
- 有始有終,設計一個結構合理的下載模組
- 從前,有一個女程式設計師……程式設計師
- 一個女程式設計師有話說程式設計師
- 做一個有想法的程式設計師,做一個屬於自己的神器程式設計師
- 一個小時搭建一個全棧 Web 應用框架(下)——美化與功能全棧Web框架
- 數學,離一個程式設計師有多近?程式設計師
- 碼農如何快速打造一個有設計感的網站網站
- 有關程式設計的12個猜想程式設計
- 有前途的程式設計師的14個習慣,你有幾個?程式設計師
- 程式設計師如何能把一個功能說的工作量很大?程式設計師
- 一名全棧設計師的Mac工具箱(設計,開發,效率)全棧Mac
- 設計包含min函式的棧函式
- 親愛的程式設計師們,我有一個很好的創意程式設計師
- 做一個有產品思維的研發:庫表設計
- 有關程式設計師的十個預言程式設計師
- 當一個java程式設計師到底有多難Java程式設計師
- 有前(錢)途的程式設計師的14個習慣,你有幾個?程式設計師
- Java的網路功能與程式設計 一 (轉)Java程式設計
- 全棧 JavaScript 程式設計師的崛起全棧JavaScript程式設計師
- 每到一個階段,都會有一個最火的程式設計師職位,目前就是前端!程式設計師前端
- 聊聊如何實現一個帶有攔截器功能的SPI
- 十個有爭議的程式設計觀點程式設計
- Linkedlist的應用場景:設計佇列、設計棧佇列
- 【介面功能設計】TopThink介面功能設計建議
- Vue的第一個元件設計Vue元件
- 如何設計一個良好的API?API
- 一個程式設計師的自白程式設計師
- 一個程式設計師的困惑?程式設計師
- 我就差一個程式設計的程式設計
- 面試了一個 39 歲程式設計師,我有點慌……面試程式設計師
- 電商專案一般有多少個介面,有哪些功能和作用?