栈和队列基础:
1)队列。队列是一种先进先出的数据类型。c++调用的话,需要添加头文件<queue>
定义方式 queue<int> xx;
基本操作:push() 入队,在队尾添加元素,无返回值。
pop() 出队,将队列头元素删除(出队),无返回值
front() 获取队列头部元素。返回头部元素的值
size() 获取队列大小
empt() 判断队列是否为空
back() 返回队列尾部元素
2)栈。栈是先进后出的数据类型,调用需要<stack>
定义方式 stack<int> xx;
基本操作:push() 入栈,在栈顶端添加元素,无返回值
pop() 出栈,将栈顶元素删除,无返回值
top() 返回栈顶的元素
size() 获得栈的大小。
empty() 判断栈是否为空。空返回true ,非空返回 false
题目:232. 用栈实现队列 - 力扣(LeetCode)
class MyQueue {
public:
stack<int> _stack_in;
stack<int> _stack_out;
MyQueue() {
}
void push(int x) {
_stack_in.push(x); // push就将数据压入大数据进入栈即可
}
int pop() { // pop是要返回最先进栈的数据,就用另一个出栈来存,
// 出栈存的就是队列的顺序了,这里要注意只有出栈空的时候才将
// 进栈的数据放入出栈
if(_stack_out.empty()) {
while(!_stack_in.empty()) {
int tmp = _stack_in.top();
_stack_in.pop();
_stack_out.push(tmp);
}
}
int reslut = _stack_out.top();
_stack_out.pop();
return reslut;
}
int peek() { // 这个可以直接调用pop函数就行,最后将该数据再push进出栈就行
int reslut = this->pop();
_stack_out.push(reslut);
return reslut;
}
bool empty() { // 出栈和进栈都空才行,这里 .empty() 空返回true
if(_stack_out.empty() && _stack_in.empty()) return true;
else return false;
}
};
题目:225. 用队列实现栈 - 力扣(LeetCode)
这道题用两个队列实现栈,主要思路就是将队列1里除了最后一个元素全部 push 到队列2 并 pop 这些元素,然后返回最后一个元素即实现了栈里的top ,如果再将这个元素pop掉就实现了 栈的pop操作,不过这里需要注意一点,当完成这些操作之后,需要将队列2再赋值给队列1,然后清空队列2,否则先 pop 再 top就出错了。代码附下:
class MyStack {
public:
queue<int> inqueue;
queue<int> outqueue;
MyStack() {
}
void push(int x) {
inqueue.push(x);
}
int pop() {
int reslut;
while(!inqueue.empty()) {
if(inqueue.size() == 1) {
reslut = inqueue.front();
inqueue.pop();
swap(inqueue, outqueue);
break;
} else {
outqueue.push(inqueue.front());
inqueue.pop();
}
}
return reslut;
}
int top() {
int reslut = this->pop();
this->push(reslut);
return reslut;
}
bool empty() {
if(inqueue.empty()) return true;
else return false;
}
};
卡尔的代码用一个队列实现很巧妙,其实就是主要是队列queue 由 size函数,所以可以先弹出 size-1个元素,然后再加入队列,这样原始队列最后的元素就变成了一个,我们返回再pop掉就行。至于top 函数 top就是原始队列的back。