区别:
栈:先进后出
队列:先进先出
Q&A:
1.C++中stack 是容器么?
2.我们使用的stack是属于哪个版本的STL?
3.我们使用的STL中stack是如何实现的?
4.stack 提供迭代器来遍历stack空间么?
回答:
1.栈有push和pop接口,但是不提供走访的功能,不提供迭代器(类似于set和map的迭代器是没有的),所以栈是有个容器完成工作,容器无所谓。所以栈不是容器,而是容器适配器。STL中的栈用的是数组和链表都可以。
2.常用的是SGI STL 这也是GCC编译器采用的STL
3.SGI STL用的默认是deque为容器的栈,双向队列实现栈,只要封住一端,另一端打通,就是栈的逻辑了。但也可以指定vector为底层,就是得多写一点。
4.对于栈而言,没有迭代器。对于队列也是一样的。
栈实现队列:
class MyQueue {
public:MyQueue() {}void push(int x) {}int pop() {}int peek() {}bool empty() {}
};
class MyQueue {
public:stack<int>stin;stack<int>stout;MyQueue() {//null ini}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();}
};
自己实现一个栈 并且用这个栈实现队列:
#include <iostream>
using namespace std;// 自定义的基于数组实现的栈类
class Stack
{
private:int *data; // 用于存储栈元素的数组int top; // 栈顶指针,指向栈顶元素的下标位置int capacity; // 栈的容量大小public:// 构造函数,初始化栈的容量Stack(int size){capacity = size;data = new int[capacity];top = -1;}// 析构函数,释放数组内存~Stack(){delete[] data;}// 判断栈是否为空bool isEmpty(){return top == -1;}// 判断栈是否已满bool isFull(){return top == capacity - 1;}// 入栈操作void push(int element){if (isFull()){cout << "Stack is full, cannot push element." << endl;return;}top++;data[top] = element;}// 出栈操作int pop(){if (isEmpty()){cout << "Stack is empty, cannot pop element." << endl;return -1;}int element = data[top];top--;return element;}// 获取栈顶元素int peek(){if (isEmpty()){cout << "Stack is empty, cannot get top element." << endl;return -1;}return data[top];}
};// 使用两个自定义栈实现队列的类
class MyQueue
{
private:Stack stin; // 用于入队操作的栈Stack stout; // 用于出队操作的栈public:// 构造函数,初始化两个栈的容量(这里假设容量相同,可按需调整)MyQueue(int size) : stin(size), stout(size) {}// 入队操作,直接将元素压入stinvoid push(int x){stin.push(x);}// 出队操作int pop(){if (stout.isEmpty()){while (!stin.isEmpty()){stout.push(stin.peek());stin.pop();}}return stout.pop();}// 获取队首元素int peek(){if (stout.isEmpty()){while (!stin.isEmpty()){stout.push(stin.peek());stin.pop();}}return stout.peek();}// 判断队列是否为空bool empty(){return stin.isEmpty() && stout.isEmpty();}
};int main()
{MyQueue myQueue(5); // 创建一个容量为5的队列myQueue.push(10);myQueue.push(20);myQueue.push(30);cout << myQueue.peek() << endl;myQueue.pop();cout << myQueue.peek() << endl;myQueue.pop();myQueue.pop();cout << (myQueue.empty() ? "Yes" : "No") << endl;return 0;
}