剑指Offer-9-用两个栈实现队列
我们知道,栈是“先进后出”而队列是“先进先出”,那么要用两个栈来实现队列想必就是通过对栈中元素进行倒腾来实现
思路
假设两个栈:stack1
和stack2
入队元素压入stack1
出队操作:
- 若stack2为空,则弹出stack1中的所有元素并压入stack2中,这样第一个弹出的便是最先进入栈中的元素
- 若stack2不为空,则直接弹出stack2的栈顶元素
编码
哈哈哈哈,信心满满准备开敲,结果看了半天题目输入输出都看不懂😂
去翻了评论,还真就不止我一个,原来大家都是啊,那我就放心了
class CQueue { public: CQueue(){ } void appendTail(int value){ s1.push(value); } int deleteHead(){ if (s2.empty()){ if (s1.empty()){ return -1; } while (!s1.empty()){ s2.push(s1.top()); s1.pop(); } } int temp = s2.top(); s2.pop(); return temp; } private: stack<int> s1, s2; };
就是因为只有stack2空了才会再去stack1里面去,这样就避免了顺序混乱导致的结果错误
2023/1/29
如何用两个栈来实现队列操作?
我们知道栈是“先进后出”,而队列是“先进先出”
如果是入队的话,其实怎么保存都可以,存起来就完事儿了
问题是出,要解决上面的矛盾
class CQueue { private: // 构造函数中初始化两个栈 stack<int> stk1; stack<int> stk2; public: CQueue() { } void appendTail(int value) { stk1.push(value); } int deleteHead() { if (stk2.empty()) { if (stk1.empty()) return -1; while (!stk1.empty()) { stk2.push(stk1.top()); stk1.pop(); } } int res = stk2.top(); stk2.pop(); return res; } };
所有的逻辑写在delete
中,注意两个成员栈写成私有更严谨
居然写出来和上面一摸一样
本文作者:YaosGHC
本文链接:https://www.cnblogs.com/yaocy/p/16150267.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步