日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

刷题:栈的相关操作

發(fā)布時間:2023/11/27 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 刷题:栈的相关操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

刷題:棧的相關操作

  • 1. 設計一個具有getMin功能的棧
  • 2. 用一個棧實現(xiàn)另一棧的排序
  • 3.Next Greater Node In Linked List

1. 設計一個具有getMin功能的棧

要求:pop、push、getMin等函數(shù)的功能的時間復雜度都是O(1)。

思路:用兩個標準棧來實現(xiàn)。其中一個棧用于存儲數(shù)據(jù)(稱為數(shù)據(jù)棧,stackData),另一個棧用于存儲當前數(shù)據(jù)棧中的最小值(稱為最小棧,stackMin)。

入棧規(guī)則:
假設入棧的數(shù)據(jù)為 num,則將其壓入stackData中,然后判斷stackMin是否為空。

  1. 如果stackMin 為空,則將num 也壓入stackMin中。
  2. 如果stackMin 不為空,則比較 num 與 stackMin 棧頂元素的大小。
  3. 如果num 小于等于 stackMin 棧頂元素,則將num 壓入stackMin中。
  4. 如果num 大于 stackMin 棧頂元素,則stackMin不做操作。

出棧規(guī)則:
將stackData的棧頂元素出棧,如該元素等于stackMin的棧頂元素,則stackMin將棧頂元素出棧。如該元素大于stackMin的棧頂元素,則stackMin不做操作。

獲取棧中最小元素時,只需要輸出stackMin的棧頂元素。

具體代碼為:

class New_stack
{
public:New_stack();~New_stack();void push(int n);void pop();int top();int getMin();private:stack<int> stack_data;stack<int> stack_min;
};New_stack::New_stack()
{
}New_stack::~New_stack()
{
}void New_stack::push(int n)
{stack_data.push(n);if (stack_min.empty())stack_min.push(n);else if (n <= stack_min.top())stack_min.push(n);}
int New_stack::top()
{return stack_data.top();
}
void New_stack::pop()
{if (stack_data.empty())cout << "The stack is empty !" << endl;if (stack_data.top() == stack_min.top())stack_min.pop();stack_data.pop();
}
int New_stack::getMin()
{if (stack_data.empty())cout << "The stack is empty !" << endl;return stack_min.top();
}

測試代碼:

int main()
{cout <<"the stack who has getMin functon " << endl;New_stack stack_min;stack_min.push(10);stack_min.push(12);stack_min.push(5);stack_min.push(3);stack_min.push(54);for (int i = 0; i < 5; ++i){cout << "the stack min value: " << stack_min.getMin() << endl;stack_min.pop();}return 0;
}

測試結果:

2. 用一個棧實現(xiàn)另一棧的排序

要求:一個棧中的元素為整型,現(xiàn)在將棧從頂?shù)降装磸拇蟮叫〉捻樞蚺判颉V辉试S申請一個棧。除此之外,可以申請新的變量,但是不允許使用其他的數(shù)據(jù)結構。

思路:申請一個棧用于存儲臨時的排序結果(記為temp_stack),申請一個變量用于記錄排序棧的棧頂元素(記為cur)。如果temp_stack為空,則將cur壓人temp_stack中;如果temp_stack不為空且cur 小于等于temp_stack的棧頂元素,則將壓入temp_stack中;如果temp_stack不為空且cur 大于temp_stack的棧頂元素,則需要將temp_stack棧中的元素壓入排序棧中,直到cur值小于等于temp_stack的元素或temp_stack為空。用這種方式排序后,temp_stack棧從頂?shù)降椎脑仨樞驗閺男〉酱蟮捻樞颉R虼?#xff0c;還需要將temp_stack棧中的元素壓入原始棧中。從而實現(xiàn)棧從頂?shù)降装磸拇蟮叫〉捻樞蚺判颉?/p>

代碼:

void sortStackbyStack(stack<int> &s)
{stack<int> temp_stack;int cur = 0;while (!s.empty()){cur = s.top();s.pop();while (!temp_stack.empty() && temp_stack.top() < cur){s.push(temp_stack.top());temp_stack.pop();}temp_stack.push(cur);}while (!temp_stack.empty()){s.push(temp_stack.top());temp_stack.pop();}
}

測試代碼:

int main()
{stack<int> s;cout << endl <<"用棧將另一個棧排序: " << endl;cout <<"    原始棧: " ;s.push(1); s.push(5); s.push(6); s.push(4); s.push(7);for (int i = 0; i < 5; ++i){cout << s.top() << " ";s.pop();}cout << endl;cout << "    排序棧: ";s.push(1); s.push(5); s.push(6); s.push(4); s.push(7);sortStackbyStack(s);for (int i = 0; i < 5; ++i){cout << s.top() << " ";s.pop();}cout << endl;return 0;
}

測試結果:

3.Next Greater Node In Linked List

Leetcode1019題

該題是查找鏈表中當前元素后面第一個大于當前元素值的元素。用暴力法解決該問題時間復雜度是O(n^2)。但是這種做法肯定難以讓人滿意。所以需要尋找一種更好的方法。

該問題的最優(yōu)解是用棧來處理。具體思路為:
棧內(nèi)存放的是 結點的編號。 每壓入一個編號前,先檢查該編號對應元素是否大于棧頂?shù)木幪枌?#xff0c;、如果大于,則棧頂編號出列,且棧頂編號對應元素的greater為 當前編號對應元素。如果不大于,則繼續(xù)壓棧。

這樣做的目的是 用棧來記錄哪些節(jié)點未找到它的目標節(jié)點。沒找到目標節(jié)點的節(jié)點就保留在棧中,那些找到目標節(jié)點的節(jié)點則記錄它的目標節(jié)點然后出棧。

具體代碼為:

vector<int> nextLargerNodes(ListNode* head) {stack<int> hole;vector<int> values;for (auto node = head; node; node = node->next)//獲取鏈表中節(jié)點的值,將其保存在values中,以便進行處理。{values.push_back(node->val);}vector<int> res(values.size(), 0);for (auto i = 0; i < values.size(); ++i) {//查找目標值的過程while (!hole.empty() && values[i] > values[hole.top()]) {res[hole.top()] = values[i];hole.pop();}hole.push(i);}return res;
}

運行結果為:

總結

以上是生活随笔為你收集整理的刷题:栈的相关操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。