1. 栈与队列基础知识
1.1 栈(stack)
栈是受限制的序列,只能在栈顶插入和删除。
栈的定义
stack<int> stk
栈的接口
// 元素入栈
stk.push(1)
// 元素出栈
stk.pop()
// 查顶
stk.top()
栈的特点:后进先出
1.2 队列
队列也是受限制的序列,只能在队尾插入,队头删除
队列的定义
queue <int> que
队列的接口
// 元素入队
queue.push(1)
// 元素出队
queue.pop()
队列的特点:先进先出
2 题目分析
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
思路
基础的想法是,数据正常储存在stack1中,appendTail函数也能正常运行。当运行deleteHead函数时,将一个栈的数据倒序存储在另一个中,达到删除头部的效果。
3 代码实现
定义Cqueue类,类的两个数据成员栈与构造函数
class Cqueue
{
public:
stack <int> stk1;
stack <int> stk2;
Cqueue () {}
}
实现appendTail函数(直接调用栈的入栈函数即可)
void appendTail(int value) {
stk1.push(value);
}
实现deleteHead函数:
- 检查是否为空,若为空则返回-1
- 循环,当stk1不为空时,弹出栈顶元素推入stk2中
- 返回stk2顶部元素并删除
- 循环,当stk2不为空时,弹出栈顶元素推入stk1中
int deleteHead() {
int val;
if (!stk1.empty())
{
while (!stk1.empty())
{
stk2.push(stk1.top());
stk1.pop();
}
val = stk2.top();
stk2.pop();
while (!stk2.empty())
{
stk1.push(stk2.top());
stk2.pop();
}
}
else val = -1;
return val;
}
提交结果
leetcode链接:图解算法数据结构 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 (leetcode-cn.com)