栈与队列理论基础
文档讲解:代码随想录
相关资料:菜鸟教程 C++ Stack(栈) 、 菜鸟教程 C++ Queue(队列)
栈是一种先进后出的数据结构,队列是一种先进先出的数据结构,栈和队列都没有走访功能和迭代器。
在SGI STL中,栈的默认底层容器是deque
,也可以指定为vector
、list
,如
std::stack<int, std::vector<int> > third; // 使用vector为底层容器的栈
在C++中,栈的常用函数有
函数 | 描述 |
---|---|
empty | 该函数用于测试堆栈是否为空。如果堆栈为空,则该函数返回true,否则返回false。 |
size | 该函数返回堆栈容器的大小,该大小是堆栈中存储的元素数量的度量。 |
top | 该函数用于访问堆栈的顶部元素。该元素起着非常重要的作用,因为所有插入和删除操作都是在顶部元素上执行的。 |
push | 该函数用于在堆栈顶部插入新元素。 |
pop | 该函数用于删除元素,堆栈中的元素从顶部删除。 |
在SGI STL中,队列的默认底层容器同样是是deque
,也可以指定为vector
、list
,如
std::queue<int, std::list<int> > third; // 使用list为底层容器的队列
在STL中栈和队列不被归类为容器,而是container adapter(容器适配器)。
在C++中,栈的常用函数有
函数 | 描述 |
---|---|
empty | 该函数用于测试队列是否为空。如果队列为空,则该函数返回true,否则返回false。 |
size | 该函数返回队列中元素的个数。 |
front | 该函数返回第一个元素。元素起着非常重要的作用,因为所有的删除操作都是在front元素上执行的。 |
back | 该函数返回最后一个元素。该元素起着非常重要的作用,因为所有插入操作都在后面元素上执行。 |
push | 该函数用于在末尾插入一个新元素。 |
pop | 该函数用于删除第一个元素。 |
232.用栈实现队列
题目链接:232. 用栈实现队列
文档讲解:代码随想录
思路
设置栈1和栈2,栈1负责输入元素,栈2负责输出元素
push
操作直接将元素压入栈1中。
pop
操作时,如果栈2为空,则先将栈1中的元素转移至栈2中,这样栈2中的元素顺序与栈1中的顺序相反,栈2栈顶的元素就是队列最前端的元素,直接弹出即可;如果栈2不为空,则直接弹出栈2栈顶的元素即可。
代码
class MyQueue {
public:
MyQueue() {
}
void push(int x) {
stack1.push(x);
}
int pop() {
if (stack2.empty()) {
while (!stack1.empty()) {
stack2.push(stack1.top());
stack1.pop();
}
}
int result = peek();
stack2.pop();
return result;
}
int peek() {
if (stack2.empty()) {
while (!stack1.empty()) {
stack2.push(stack1.top());
stack1.pop();
}
}
return stack2.top();
}
bool empty() {
if (stack1.empty() && stack2.empty())
return true;
else
return false;
}
private:
stack<int> stack1, stack2;
};
225. 用队列实现栈
题目链接:225. 用队列实现栈
文档讲解:代码随想录
思路
思路一: 使用两个队列队列1和队列2,其中队列1用于输入和输出元素,队列2用于备份。push
时直接将元素入队至队列1中,pop
操作时,先将队列1中除最后一个元素外的其余元素入队至队列2中,然后将队列1中剩余的一个元素出队,最后将队列2中的元素移回队列1,这样队列中元素的顺序没有改变。
思路二: 使用一个队列,push
时直接将元素入队至队列,pop
时,先将队列中除最后一个元素外的其余元素移至队列的末尾,然后使队列第一个元素出队即可。
代码
思路一代码
class MyStack {
public:
MyStack() {
}
void push(int x) {
q1.push(x);
}
int pop() {
int size = q1.size();
for (int i = 0; i < size - 1; i++) {
q2.push(q1.front());
q1.pop();
}
int result = q1.front();
q1.pop();
while (!q2.empty()) {
q1.push(q2.front());
q2.pop();
}
return result;
}
int top() {
int result = this->pop();
this->push(result);
return result;
}
bool empty() {
return q1.empty();
}
private:
queue<int> q1, q2;
};
思路二代码
class MyStack {
public:
MyStack() {
}
void push(int x) {
q.push(x);
}
int pop() {
int size = q.size();
for (int i = 0; i < size - 1; i++) {
q.push(q.front());
q.pop();
}
int result = q.front();
q.pop();
return result;
}
int top() {
return q.back();
}
bool empty() {
return q.empty();
}
private:
queue<int> q;
};