Stack与Queue基本知识复习
首先Stack和Queue是STL(C++标准库)里面的两个数据结构,但是不同版本的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是开源软件,源码可读性甚高。
接下来总结的是SGI STL,Stack跟Queue是以底层容器完成其所有的工作,对外提供统一的接口(不提供iterator来遍历),底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。
所以是Container Adapter,底层实现则是用vector,deque(默认),list。通过以下指令在宣告时可以指定底层逻辑
std::stack<int, std::vector<int> > third;
std::queue<int, std::list<int>> third;
232.用栈实现队列
使用两个栈来实现队列的话,我们可以一个用来专门输入,一个专门用来输出。将资料放置输出的时后就是使用者调用pop函数时。
class MyQueue {
public:
stack<int> dataIn;
stack<int> dataOut;
MyQueue() { }
void push(int x) {
dataIn.push(x);
}
int pop() {
// 如果dataOut空了就将dataIn的资料全部取出来,然后放进dataOut里面
if(dataOut.empty()){
while(!dataIn.empty()){
auto tempData = dataIn.top();
dataIn.pop();
dataOut.push(tempData);
}
}
auto result = dataOut.top();
dataOut.pop();
return result;
}
int peek() {
// 调用自身的pop函数,再将资料放回dataOut;
auto result = this->pop();
dataOut.push(result);
return result;
}
bool empty() {
return dataIn.empty() && dataOut.empty();
}
};
225. 用队列实现栈
运用前一题的思想,将资料提出来又放回去,直到拿到顶层资料。
class MyStack {
public:
queue<int> data;
MyStack() { }
void push(int x) {
data.push(x);
}
int pop() {
auto operation = data.size() - 1;
while(operation--){
data.push(data.front());
data.pop();
}
auto result = data.front();
data.pop();
return result;
}
int top() {
auto result = this->pop();
data.push(result);
return result;
}
bool empty() {
return data.empty();
}
};