文章目录
声明
作为做题记录,仅供参考。
转载请注明!
若有错误,欢迎指正!
栈和队列
剑指offer
用两个栈实现队列(剑指offer 09)
题目描述
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
题目链接
分析
用两个栈组成一个队列,进栈固定只进s1,出战固定只从s2出。当s2为空时,将s1全部取出放到s2中,然后从s2“出队”。只有s1、s2都为空,队列才为空。
代码
C++版
#include<stack>
class CQueue {
public:
stack<int> *s1;
stack<int> *s2;
CQueue() {
s1 = new stack<int>();
s2 = new stack<int>();
}
void appendTail(int value) {
s1->push(value);
}
int deleteHead() {
if(s2->empty()){
while(!s1->empty()){
s2->push(s1->top());
s1->pop();
}
}
if(s2->empty())
return -1;
else{
int num = s2->top();
s2->pop();
return num;
}
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/
python版
class CQueue:
def __init__(self):
self.s1 = []
self.s2 = []
def appendTail(self, value: int) -> None:
self.s1.append(value)
def deleteHead(self) -> int:
if len(self.s2) == 0:
while len(self.s1) != 0:
self.s2.append(self.s1.pop())
if len(self.s2) == 0:
return -1
else:
num = self.s2.pop()
return num
包含min函数的栈(剑指offer30)
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
分析
用两个栈组成,一个栈s存放栈本身的元素,另一个栈m存放对应的栈顶情况的最小值。当入栈的元素x小于m的栈顶元素时,x同时入s和m;当x大于等于m栈顶元素,将m的栈顶元素重复入栈。
代码
C++版
class MinStack {
public:
/** initialize your data structure here. */
stack<int> * s;
stack<int>* m;
MinStack() {
s = new stack<int>();
m = new stack<int>();
m->push(INT_MAX);
}
void push(int x) {
if(m->top()>x){
m->push(x);
}else{
m->push(m->top());
}
s->push(x);
}
void pop() {
s->pop();
m->pop();
}
int top() {
return s->top();
}
int min() {
return m->top();
}
};
/**
* 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->min();
*/
python版
import sys
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.s = []
self.m = []
def push(self, x: int) -> None:
if len(self.m) == 0 or x<self.m[-1]:
self.m.append(x);
else:
self.m.append(self.m[-1])
self.s.append(x)
def pop(self) -> None:
self.s.pop()
self.m.pop()
def top(self) -> int:
return self.s[-1]
def min(self) -> int:
return self.m[-1]
队列的最大值(剑指offer59)
题目描述
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
若队列为空,pop_front 和 max_value 需要返回 -1
分析
用到双端队列(使用方法)deque.
入队:如果 deque队尾元素小于即将入队的元素 value,则将小于 value 的元素全部出队后,再将 value入队;否则直接入队。(注意deque不为空)
出队:当队列出队的元素等于deque头部元素,则将deque头部元素也出队,反之则不出队。
最大元素:deque的头部元素
代码
C++版
class MaxQueue {
public:
queue<int> *q;
deque<int> *m;
MaxQueue() {
q = new queue<int>;
m = new deque<int>;
}
int max_value() {
if(q->empty()){
return -1;
}else
return m->front();
}
void push_back(int value) {
while(!m->empty()&&m->back()<value){
m->pop_back();
}
q->push(value);
m->push_back(value);
}
int pop_front() {
if(q->empty()){
return -1;
}else{
int tmp = q->front();
if(m->front()==tmp)
m->pop_front();
q->pop();
return tmp;
}
}
};
/**
* Your MaxQueue object will be instantiated and called as such:
* MaxQueue* obj = new MaxQueue();
* int param_1 = obj->max_value();
* obj->push_back(value);
* int param_3 = obj->pop_front();
*/