理论基础
队列是先进先出,栈是先进后出。
四个问题:
- C++中stack 是容器么?
- 我们使用的stack是属于哪个版本的STL?
- 我们使用的STL中stack是如何实现的?
- stack 提供迭代器来遍历stack空间么?
栈和队列是STL(C++标准库)里面的两个数据结构。
栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator来遍历所有元素。
栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)
栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。
232.用栈实现队列
队列是先进先出,栈是先进后出。
之前本科学过,早就忘记了。这里需要注意三个概念,分别是push、pop、top,搞清楚这三个概念就是可以进行后续的操作的。代码如下所示:
class MyQueue {
public:
//首先声明两个栈,一个入栈一个出栈
stack<int> in;
stack<int> out;
MyQueue() {
}
void push(int x) {
//入栈过程
in.push(x);
}
int pop() {
//首先判断出栈是否为空
while(out.empty())
{
//判断入栈是否为空,在不为空的情况下
while(!in.empty())
{
out.push(in.top());
in.pop();
}
}
int result = out.top();
out.pop();
return result;
}
int peek() {
int result1 = this->pop();
out.push(result1);
return result1;
}
bool empty() {
return in.empty()&&out.empty();
}
};
/**
* 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. 用队列实现栈
思路弹出元素的过程就是将前面的size()-1弹出去,然后再加入后面就是可以的。
这个代码比较简单,一次运行成功。
class MyStack {
public:
//首先声明队列
queue<int> que;
MyStack() {
}
void push(int x) {
que.push(x);
}
int pop() {
int queSize = que.size();
queSize = queSize - 1;//首先将数目减一操作
while(queSize--)
{
que.push(que.front());
que.pop();
}
int result = que.front();
que.pop();
return result;
}
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();
*/