栈与堆列理论基础
1、基本特性:栈先进后出,队列先进先出
2、不同STL版本对应其不同实现原理,以SGI STL为例,如果不指定栈的实现原理,默认是deque,当然也可以通过stack<int,std::vector<int>> 方式指定栈的实现原理,因此通常不把栈和堆列称为容器,而称其为container adapter(容器适配器),主要实现原理就是数组和链表的底层实现。
LeetCode232.用栈实现队列
用两个栈来实现数据的倒换,经过两个栈之后,数据就变为符合队列的输出顺序,因此可设置一个输入栈一个输出栈
时间复杂度: push和empty为O(1), pop和peek为O(n)
空间复杂度: O(n)
class MyQueue {
stack<int> st_in;
stack<int> st_out;
public:
MyQueue() {
}
void push(int x) {
st_in.push(x);
}
int pop() {
int res;
if(st_out.empty()){
while(!st_in.empty()){
st_out.push(st_in.top());
st_in.pop();
}
}
if(!st_out.empty()){
res = st_out.top();
st_out.pop();
}
return res;
}
int peek() {
if(st_out.empty()){
while(!st_in.empty()){
st_out.push(st_in.top());
st_in.pop();
}
}
return st_out.top();
}
bool empty() {
if(st_in.empty() && st_out.empty()) return true;
return false;
}
};
LeetCode225. 用队列实现栈
经过上道题之后惯性思维还是用两个队列模拟一个栈,其实一个堆列就可以,另一个队列起到一个备份的作用,目的就是备份第一个队列的前n-1个元素,然后取出最后一个当作栈的输出,最后恢复现场。
时间复杂度: pop为O(n),top若使用如下代码为O(n),若直接使用que1.back则为O(1)
空间复杂度: O(n)
class MyStack {
public:
queue<int> que1;
queue<int> que2;
MyStack() {
}
void push(int x) {
que1.push(x);
}
int pop() {
int len1 = que1.size()-1;
while(len1--){
que2.push(que1.front());
que1.pop();
}
int res = que1.front();
que1.pop();
int len2 = que2.size();
while(len2--){
que1.push(que2.front());
que2.pop();
}
return res;
}
int top() {
int len1 = que1.size()-1;
while(len1--){
que2.push(que1.front());
que1.pop();
}
int res = que1.front();
que1.pop();
int len2 = que2.size();
while(len2--){
que1.push(que2.front());
que2.pop();
}
que1.push(res);
return res;
}
bool empty() {
return que1.empty();
}
};