文章目录
链表实现最小栈,有虚拟头节点
题目
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) —— 将元素 x 推入栈中。
- pop() —— 删除栈顶的元素。
- top() —— 获取栈顶元素。
- getMin() —— 检索栈中的最小元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-stack
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码
#include<iostream>
using namespace std;
class MinStack {//链表实现栈,有一个虚拟头节点
public:
/** initialize your data structure here. */
typedef struct ListNode {
int val;
ListNode* next;
ListNode() :val(0), next(nullptr) {}
}ListNode;
private:
//数据
ListNode* dummyHead;//虚拟头节点
public:
MinStack() {
dummyHead = new ListNode();
}
void push(int x) {//入栈
ListNode* head = new ListNode();
head->val = x;
head->next = dummyHead->next;
dummyHead->next = head;
}
void pop() {//弹栈,也就是删除栈顶的元素
if (dummyHead->next == nullptr)//空栈d
return;
ListNode* deleteNode = dummyHead->next;
dummyHead->next = deleteNode->next;
delete deleteNode;
}
int top() {//返回栈顶元素
if (dummyHead->next)
return dummyHead->next->val;
return -1;//代表没有元素可以返回
}
int getMin() {
if (dummyHead->next == nullptr)
return INT_MAX;//空栈
ListNode* p = dummyHead->next;
int min = INT_MAX;
while (p) {
if (min > p->val)
min = p->val;
p = p->next;
}
return min;
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(x);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/
int main()
{
MinStack a;
a.push(1);
cout << a.top() << endl;
a.push(2);
cout << a.top() << endl;
a.pop();
cout << a.top() << endl;
a.push(1);
cout << a.top() << endl;
a.push(2);
cout << a.top() << endl;
a.push(0);
a.push(-2);
a.push(200);
cout << a.top() << endl;
cout << a.getMin() << endl;
return 0;
}
总结
- 设置了一个虚拟头节点,方便头插和头删
- 复习链表知识