zoukankan      html  css  js  c++  java
  • 左神算法书籍《程序员代码面试指南》——1_05用一个栈实现另一个栈的排序

    【题目】

    一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,
    只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。
    如何完成排序?

    【题解】

    将要排序的栈记为stack,申请的辅助栈记为help。在stack上执行pop操作,弹出的元素记为cur。
    ·如果cur小于或等于help的栈顶元素,则将cur直接压入help;
    ·如果cur大于help的栈顶元素,则将help的元素逐一弹出,
    逐一压入stack,直到cur小于或等于help的栈顶元素,再将cur压入help。
    一直执行以上操作,直到stack中的全部元素都压入到help。
    最后将help中的所有元素逐一压入stack,即完成排序。

    【代码】

     1 #pragma once
     2 #include <iostream>
     3 #include <stack>
     4 
     5 using namespace std;
     6 
     7 //一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,
     8 //只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。
     9 //如何完成排序?
    10 //
    11 //我的想法就是有n个数,那就倒腾n次,每次找到一个最小值
    12 //将要排序的栈记为stack,申请的辅助栈记为help。在stack上执行pop操作,弹出的元素记为cur。
    13 //·如果cur小于或等于help的栈顶元素,则将cur直接压入help;
    14 //·如果cur大于help的栈顶元素,则将help的元素逐一弹出,
    15 //    逐一压入stack,直到cur小于或等于help的栈顶元素,再将cur压入help。
    16 //一直执行以上操作,直到stack中的全部元素都压入到help。
    17 //    最后将help中的所有元素逐一压入stack,即完成排序。
    18 
    19 
    20 
    21 void stackSort(stack<int>&s)
    22 {
    23     if (s.size() < 2)
    24         return;
    25     stack<int>h;
    26     while (!s.empty())
    27     {
    28         int a = s.top();
    29         s.pop();
    30         while (!h.empty() && a > h.top())//当原栈顶元素大于h栈顶元素,将h栈数据全部弹出
    31         {
    32             s.push(h.top());
    33             h.pop();
    34         }
    35         h.push(a);
    36     }
    37     while (!h.empty())//排好的数据返回给原栈
    38     {
    39         s.push(h.top());
    40         h.pop();
    41     }
    42 }
    43 
    44 
    45 void printStack(stack<int>s)
    46 {
    47     while (!s.empty())
    48     {
    49         cout << s.top() << " ";
    50         s.pop();
    51     }
    52     cout << endl;
    53 }
    54 
    55 void Test()
    56 {
    57     stack<int>s;
    58     s.push(5);
    59     s.push(2);
    60     s.push(3);
    61     s.push(4);
    62     s.push(1);
    63     printStack(s);
    64     stackSort(s);
    65     printStack(s);
    66 }
  • 相关阅读:
    1007 素数对猜想 (20 分)
    1005 继续(3n+1)猜想 (25 分)
    1002 写出这个数 (20 分)
    1001 害死人不偿命的(3n+1)猜想 (15 分)
    mysql常用操作
    mysql乱码问题
    mysql忘记root密码
    linux开机启动
    fedora 调整屏幕亮度
    Access denied for user 'root'@'localhost' (using password:YES) 解决方案
  • 原文地址:https://www.cnblogs.com/zzw1024/p/11170573.html
Copyright © 2011-2022 走看看