2014-03-18 05:33
题目:用两个栈来实现一个队列。
解法:栈是反的,队列是正的,反了再反就正过来了。所以,请看代码。操作中时间复杂度有O(1)的,有O(n)的,但均摊下来时间符合O(1)。
代码:
1 // 3.5 Implement a queue MyQueue using two stacks. 2 #include <climits> 3 #include <cstdio> 4 #include <cstring> 5 #include <stack> 6 using namespace std; 7 8 template<class T> 9 class MyQueue { 10 public: 11 bool empty() { 12 return s1.empty() && s2.empty(); 13 } 14 15 void push(const T &val) { 16 s1.push(val); 17 } 18 19 void pop() { 20 if (s2.empty()) { 21 while (!s1.empty()) { 22 s2.push(s1.top()); 23 s1.pop(); 24 } 25 } 26 s2.pop(); 27 } 28 29 T front() { 30 if (s2.empty()) { 31 while (!s1.empty()) { 32 s2.push(s1.top()); 33 s1.pop(); 34 } 35 } 36 37 return s2.top(); 38 } 39 40 T back() { 41 if (s1.empty()) { 42 while (!s2.empty()) { 43 s1.push(s2.top()); 44 s2.pop(); 45 } 46 } 47 48 return s1.top(); 49 } 50 private: 51 stack<T> s1, s2; 52 }; 53 54 int main() 55 { 56 MyQueue<int> qq; 57 char s[100]; 58 int op; 59 60 while (scanf("%s", s) == 1) { 61 if (strcmp(s, "end") == 0) { 62 break; 63 } else if (strcmp(s, "push") == 0) { 64 scanf("%d", &op); 65 qq.push(op); 66 } else if (strcmp(s, "pop") == 0) { 67 qq.pop(); 68 } else if (strcmp(s, "front") == 0) { 69 printf("%d\n", qq.front()); 70 } else if (strcmp(s, "back") == 0) { 71 printf("%d\n", qq.back()); 72 } 73 } 74 75 return 0; 76 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)