栈与队列理论基础
队列是先进先出,栈是先进后出
三个最为普遍的STL版本:
-
HP STL 其他版本的C++ STL,一般是以HP STL为蓝本实现出来的,HP STL是C++ STL的第一个实现版本,而且开放源代码。
-
P.J.Plauger STL 由P.J.Plauger参照HP STL实现出来的,被Visual C++编译器所采用,不是开源的。
-
SGI STL 由Silicon Graphics Computer Systems公司参照HP STL实现,被Linux的C++编译器GCC所采用,SGI STL是开源软件,源码可读性甚高。
栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。 底层是通过数组和链表实现的。
232. 用栈实现队列
队列为先进先出规则,而栈为先进后出规则,使用一个栈无法实现。使用栈用于模拟队列可以使用两个栈,要获取先进的第一个元素,可以先讲其中一个栈弹出保存到另外一个栈(每次转移的时候必须出栈的为空,然后将入栈的所有数值保存到出栈),然后另外一个栈的顶部就是最先进入的第一个数。
class MyQueue {
public:
stack<int> instack;
stack<int> outstack;
MyQueue() {
}
void push(int x) {
instack.push(x);
}
int pop() {
if(outstack.empty()){
while(!instack.empty()){
int tmp=instack.top();
instack.pop();
outstack.push(tmp);
}
}
int result=outstack.top();
outstack.pop();
return result;
}
int peek() {
int res = this->pop(); // 直接使用已有的pop函数
outstack.push(res); // 因为pop函数弹出了元素res,所以再添加回去
return res;
}
bool empty() {
if(outstack.empty()&&instack.empty())return true;
else return false;
}
};
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue* obj = new MyQueue();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->peek();
* bool param_4 = obj->empty();
*/
225. 用队列实现栈
使用队列模拟栈可以不用两个堆栈,因为在弹出的时候可以将前面的数重新插回尾部(对比前面的堆栈,进入和出去都是一个口,而队队列进出不同口),达到先进后出的效果。
class MyStack {
public:
queue<int> que;
MyStack() {
}
void push(int x) {
que.push(x);
}
int pop() {
int size=que.size();
size--;
while(size--){
que.push(que.front());
que.pop();
}
int res=que.front();
que.pop();
return res;
}
int top() {
return que.back();
}
bool empty() {
return que.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/