大众思路:

用两个栈实现,记为s1,s2

1.元素入栈时,加入s1

2.元素出栈时,对s2进行判断,如果s2为空,则将全部s1元素弹出并压入到s2,然后从s2栈顶弹出一个元素;如果s2不为空,则直接从s2的栈顶弹出一个元素

冷门思路:

这种思路效率比较低

1.元素入栈时,加入s1

2.元素出栈时,对s2进行判断,如果s2为空,则将全部s1元素弹出并压入到s2,然后从s2栈顶弹出一个元素;再将元素倒回s1

这样做的缺点是需要在两个栈之间倒来倒去,效率较低。

如下图所示:

我的思路是第一种,C++实现:

class Queue {
public:
// Push element x to the back of queue.
void push(int x) {
stk1.push(x);
} // Removes the element from in front of queue.
void pop(void) {
if (stk2.empty()) {
while (!stk1.empty()) {
stk2.push(stk1.top());
stk1.pop();
}
}
stk2.pop();
} // Get the front element.
int peek(void) {
if (stk2.empty()) {
while (!stk1.empty()) {
stk2.push(stk1.top());
stk1.pop();
}
}
return stk2.top();
} // Return whether the queue is empty.
bool empty(void) {
return stk1.empty()&&stk2.empty();
}
stack<int> stk1;
stack<int> stk2;
};

我的实现中有一个细节没把握好,就是如果两个栈都为空时,我执行了deque操作, 将会导致程序崩溃。实际上在执行pop前需要先对队列是否为空进行一次判断。
修正后的pop函数为

    void pop(void) {
if (!empty()) {
if (stk2.empty()) {
while (!stk1.empty()) {
stk2.push(stk1.top());
stk1.pop();
}
}
stk2.pop();
}
}

上述思路,可行性毋庸置疑。但有一个细节是可以优化一下的。即:在出队时,将s1的元素逐个“倒入”s2时,原在s1栈底的元素,不用“倒入”s2(即只“倒”s1.Count()-1个),可直接弹出作为出队元素返回。这样可以减少一次压栈的操作。

最新文章

  1. gRPC源码分析1-SSL/TLS
  2. Unable to load configuration. - Class: java.net.AbstractPlainSocketImpl
  3. CSS3动画
  4. 完全变味的Windows Azure Marketplace中国版
  5. 实现解耦-Spring.Net
  6. Android课程---视图组件的总结
  7. ubuntu apt源
  8. 真机模拟器.a文件编译报错
  9. Git 的简单使用
  10. iOS中touches事件,addtarget ...action和GestureRecognizer详解
  11. QtSQL学习笔记(2)- 连接到数据库
  12. PHP 根据值查找键名
  13. test_markdown
  14. 总结:如何驱动DS18B20温度传感器
  15. mybatis中#{}与${}的区别
  16. html页面原生video标签隐藏下载按钮
  17. java二分查找
  18. Linux进程相关命令使用场景
  19. Eclipse添加JDK,JRE切换
  20. Storm目录树和任务提交过程

热门文章

  1. 启动memcache 服务器端
  2. FusionCharts数据展示成饼状图、柱状图和折线图
  3. MVC 控制器中直接访问url 的方式
  4. 读ios开发有感——建立APP开发体系
  5. Dockerfile定制镜像
  6. [国家集训队2012]middle(陈立杰)
  7. 实现移动端touch事件的横向滑动列表效果
  8. Re-thinking Deep Residual Networks
  9. Ubuntu 18.04 的网络配置
  10. Hush Framework框架配置(续) 转自《Android和PHP最佳实践》官方站