1. 栈与队列理论基础
1.1 栈
「栈 Stack」是一种遵循先入后出(First In, Last Out)原则的线性数据结构
在栈中,我们把堆叠元素的顶部称为「栈顶」,底部称为「栈底」。将把元素添加到栈顶的操作叫做「入栈」,而
删除栈顶元素的操作叫做「出栈」。
栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)
栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。
我们常用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的底层结构
1.2 队列
「队列 Queue」是一种遵循先入先出(First In, First Out)规则的线性数据结构
我们把队列的头部称为「队首」,尾部称为「队尾」,把将元素加入队尾的操作称为「入队」,删除队首元素的操
作称为「出队」。
2. 232用栈实现队列
题目:使用栈实现队列的下列操作
push(x)
-- 将一个元素放入队列的尾部。 pop()
-- 从队列首部移除元素。 peek()
-- 返回队列首部的元素。 empty()
-- 返回队列是否为空。
-
你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
-
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
-
假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)
解题步骤:
-
定义两个栈,一个输入栈,一个输出栈。
-
初始化数据结构,并将数据放入输入栈
-
移除输入栈的元素,放进输出栈中。
(1)如果输出栈为空,就把进栈数据全部导入进来(注意是全部导入)
(2)如果输出栈不为空,则直接从输出栈弹出数据
代码如下:
#include<iostream>
#include <stack> //栈容器头文件
using namespace std;
class MyQuene {
public:
stack<int> stIn;
stack<int> stOut;
MyQuene() { //构造函数,初始化栈
stIn = stack<int>();
stOut = stack<int>();
}
// 输入元素
void push(int x) {
stIn.push(x);
}
// 移除输入栈中的元素到输出栈中
int pop() {
// 只有当输出栈为空时,再从输入栈中导入数据(全部)
if (stOut.empty()) {
// 从输入栈中导入数据直到输入栈为空
while (!stIn.empty()) {
stOut.push(stIn.top());
stIn.pop();
}
}
int result = stOut.top();
stOut.pop();
return result;
}
// 获取首元素
int peek() {
int res = this->pop();
stOut.push(res);
return res;
}
// 判断是否队列为空
bool empty() {
return stIn.empty() && stOut.empty();
}
};
int main(void) {
MyQuene solu;
solu.push(1);
solu.push(2);
solu.push(3);
cout << solu.pop() << endl;
cout << solu.peek() << endl;
cout << solu.empty() << endl;
system("pause");
return 0;
}
3. 225用队列实现栈
题目:使用队列实现栈的下列操作
-
push(x)
-- 元素 x 入栈 -
pop()
-- 移除栈顶元素 -
top()
-- 获取栈顶元素 -
empty()
-- 返回栈是否为空
注意:
-
你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。
-
你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
-
你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。
解题思路:
-
定义一个队列
-
初始化数据结构,并将数据放入队列
-
移除队列的首元素
代码如下:
#include<iostream>
#include<queue>
using namespace std;
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 result = que.front();
que.pop();
return result;
}
int top() {
return que.back();
}
bool empty() {
return que.empty();
}
};
int main(void) {
MyStack solu;
solu.push(1);
solu.push(2);
solu.push(3);
cout << solu.pop() << endl;
cout << solu.top() << endl;
cout << solu.empty() << endl;
system("pause");
return 0;
}