• 《Cracking the Coding Interview》——第3章:栈和队列——题目6


    2014-03-19 03:01

    题目:给定一个栈,设计一个算法,在只使用栈操作的情况下将其排序。你可以额外用一个栈。排序完成后,最大元素在栈顶。

    解法:我在草稿纸上试了试{1,4,2,3}之类的小例子,大概两三分钟有了思路。既然比较性排序是基于比较和交换的,那么就在两个栈的栈顶进行比较,同时在栈顶进行交换,此处需要O(1)的空间来进行交换。具体实现请看代码,时间复杂度为O(n^2)。

    代码:

     1 // 3.6 Try to sort the elements in a stack with the aid of at most one more stack.
     2 #include <cstdio>
     3 #include <stack>
     4 using namespace std;
     5 
     6 class Solution {
     7 public:
     8     void sortStack(stack<int> &s1) {
     9         if (s1.empty()) {
    10             return;
    11         }
    12         // extra O(n) here
    13         stack<int> s2;
    14         // extra O(1) here
    15         int val;
    16         
    17         while (!s1.empty()) {
    18             if (s2.empty() || s1.top() <= s2.top()) {
    19                 s2.push(s1.top());
    20                 s1.pop();
    21             } else {
    22                 val = s1.top();
    23                 s1.pop();
    24                 while (!s2.empty() && s2.top() < val) {
    25                     s1.push(s2.top());
    26                     s2.pop();
    27                 }
    28                 s2.push(val);
    29             }
    30         }
    31         while (!s2.empty()) {
    32             s1.push(s2.top());
    33             s2.pop();
    34         }
    35     }
    36 };
    37 
    38 int main()
    39 {
    40     Solution sol;
    41     int i, n, val;
    42     stack<int> st;
    43     
    44     while (scanf("%d", &n) == 1 && n > 0) {
    45         for (i = 0; i < n; ++i) {
    46             scanf("%d", &val);
    47             st.push(val);
    48         }
    49         sol.sortStack(st);
    50         
    51         printf("%d", st.top());
    52         st.pop();
    53         while (!st.empty()) {
    54             printf(" %d", st.top());
    55             st.pop();
    56         }
    57         printf("
    ");
    58     }
    59     
    60     return 0;
    61 }
  • 相关阅读:
    apache 修改文件上传大小限制
    linux 桥接模式下 固定ip 设置
    简易 红包生成
    Sublime Text 3 快捷键
    excle 文件的导入和导出
    php 下载文件
    右则css 小浮条
    html 自动跳转页面
    Media Queries详细
    mobile响应式页面meta信息相关记录
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3610466.html
Copyright © 2020-2023  润新知