zoukankan      html  css  js  c++  java
  • 栈的应用——对栈排序、用栈实现队列的功能

    一:写一个算法将栈里的元素升序排列。栈的实现未知,算法只能借助栈完成,可使用的函数有push、pop、top、empty等。

    思路:可借助另外一个栈来完成排序。

    1、从原始栈里依次弹出元素放入辅助栈;

    2、每当将要压入的元素是得辅助栈不是升序排列,就将辅助栈里面的元素重新压入原始栈中;

    3、直到辅助栈里面的元素都小于当前要压入的元素;

    4、压入当前的元素。

    代码如下:

     1 #include <iostream>
     2 #include <string>
     3 #include <stack>
     4 #include <stdlib.h>
     5 #include <time.h>
     6 
     7 using namespace std;
     8 
     9 void stack_print( stack<int> tmp)
    10 {
    11     while( !tmp.empty())
    12     {
    13         cout << tmp.top() << " " ;
    14         tmp.pop();
    15     }
    16     cout << endl;
    17 }
    18 
    19 stack<int> stack_sort( stack<int> s)
    20 {
    21     if(s.size() <=1)
    22         return s;
    23 
    24     stack<int> r;
    25 
    26     while(!s.empty())
    27     {
    28         int tmp = s.top();
    29         s.pop();
    30         while( !r.empty() && tmp > r.top())
    31         {
    32             s.push(r.top());
    33             r.pop();
    34         }
    35         r.push(tmp);
    36     }
    37     return r;
    38 }
    39 
    40 int main(int argc, char const *argv[])
    41 {
    42     srand(time(NULL));
    43 
    44     stack<int> s;
    45     for (int i = 0; i < 10; ++i)
    46     {
    47         s.push(rand()%100);
    48     }    
    49     stack_print(s);
    50 
    51     stack<int> tmp = stack_sort(s);
    52     stack_print(tmp);
    53     
    54     return 0;
    55 }
    View Code

    二:如何用两个栈实现队列的功能?
    思路:假设有两个栈t1与t2;

    1、将刚刚入队的元素保存到t1,中。

    2、若需要出队列,则需要判断 t2是否为空。

    一)若t2为空,则将t1所有的元素都压入t2中(此时t2中的元素顺序为元素的入队顺序,从而实现先进先出的功能),然后取出t2栈顶元素即可;

    二)若t2为非空(此时t2中元素为t1之前压入,其栈顶就是最早入队的元素),则直接取出t2的栈顶即可。

    代码如下:

     1 #include <iostream>
     2 #include <string>
     3 #include <stack>
     4 #include <stdlib.h>
     5 #include <time.h>
     6 
     7 using namespace std;
     8 
     9 template <typename T>
    10 class MQueue
    11 {
    12 public:
    13     MQueue() { }
    14 
    15     int size()const;
    16 
    17     bool empty()const
    18     { return size() == 0;}
    19 
    20     void push( const T &);
    21     const T front();
    22     void pop();
    23 private:
    24     stack<T> t1; //实现进“队”功能
    25     stack<T> t2; //实现出“队”功能
    26 };
    27 
    28 template <typename T>
    29 int MQueue<T>::size()const
    30 {
    31     return t1.size() + t2.size();
    32 }
    33 template <typename T>
    34 void MQueue<T>::push( const T &data)
    35 {
    36     t1.push(data);
    37 }
    38 
    39 template <typename T>
    40 const T MQueue<T>::front()
    41 {
    42     if( t2.empty())//如果t2为空,则将t1中的元素压入t2中
    43     {
    44         while(!t1.empty())
    45         {
    46             t2.push( t1.top());
    47             t1.pop();
    48         }
    49     }
    50 
    51     return t2.top();;
    52 }
    53 
    54 template <typename T>
    55 void MQueue<T>::pop()
    56 {
    57     if( t2.empty())//如果t2为空,则将t1中的元素压入t2中
    58     {
    59         while(!t1.empty())
    60         {
    61             t2.push( t1.top());
    62             t1.pop();
    63         }
    64     }
    65     t2.pop();
    66 }
    67 
    68 int main(int argc, char const *argv[])
    69 {
    70     MQueue<int> myq;
    71 
    72     for (int i = 0; i < 10; ++i)
    73     {
    74         myq.push(rand()%100);
    75     }
    76     cout << "Init size: " << myq.size() << endl;
    77     
    78     while( !myq.empty())
    79     {
    80         cout << myq.front()<< " ";
    81         myq.pop();
    82     }
    83     cout << endl;
    84     cout << "End size: " << myq.size() << endl;
    85     return 0;
    86 }
    View Code

    完毕。

  • 相关阅读:
    EJB Timer Service is not available. Timers for application with id 95795415990861824 will not be deleted
    MySql数据基本操作sql语句
    python 将字符串转换成字典dict的各种方式总结
    Go语言笔记:struct结构遍历
    golang实现base64编解码
    map赋值前要先初始化:assignment to entry in nil map
    python中 .write 无法向文件写入内容
    python 守护进程
    go语言解析 map[string]interface{} 数据格式
    python虚拟环境--virtualenv
  • 原文地址:https://www.cnblogs.com/xfxu/p/4092389.html
Copyright © 2011-2022 走看看