剑指offer9. 两个栈实现队列 p68

mac2024-04-17  40

剑指offer9. 两个栈实现队列 p68

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail 和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。

/*在stack1 中存入;从stack2里取,如果取得时候2是null,把1的值全压到2再取 */

#include <iostream> #include<stack> #include<stdexcept> template <typename T> class CQueue { public: CQueue(void){ }; // 不能只写个名字 ~CQueue(void){}; void appendTail(const T& node) { // node的值不能被改变 stack1.push(node); } T deleteHead() { if (stack2.empty()) { while (!stack1.empty()) { stack2.push(stack1.top()); stack1.pop(); } } if (stack2.empty()) { // 说明没有插入数据 ,抛出,不会往下执行 std::logic_error ex("queue is null !"); throw std::exception(ex); } T t = stack2.top(); stack2.pop(); return t; } private: std::stack<T> stack1; std::stack<T> stack2; };

扩展: 用两个队列模拟栈 思想: 两个队列交替充当队列。比如 压栈c时:往非空的队列1插入c,1内容变成cba。弹栈时,需要的是c,但是队列1头是a,那么依此把队列1的内容插入队列2中,把最后一个元素c返回。这时队列2变成非空了,那么再压栈就往2里插入了。如此循环

最新回复(0)