栈的应用——对栈排序、用栈实现队列的功能

一:写一个算法将栈里的元素升序排列。栈的实现未知,算法只能借助栈完成,可使用的函数有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

完毕。

posted @ 2014-11-12 15:24  Stephen_Hsu  阅读(634)  评论(0编辑  收藏  举报