一:写一个算法将栈里的元素升序排列。栈的实现未知,算法只能借助栈完成,可使用的函数有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 }
二:如何用两个栈实现队列的功能?
思路:假设有两个栈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 }
完毕。
时间: 2024-10-11 07:47:04