栈的应用——对栈排序、用栈实现队列的功能
2014-11-12 15:24
302 查看
一:写一个算法将栈里的元素升序排列。栈的实现未知,算法只能借助栈完成,可使用的函数有push、pop、top、empty等。
思路:可借助另外一个栈来完成排序。
1、从原始栈里依次弹出元素放入辅助栈;
2、每当将要压入的元素是得辅助栈不是升序排列,就将辅助栈里面的元素重新压入原始栈中;
3、直到辅助栈里面的元素都小于当前要压入的元素;
4、压入当前的元素。
代码如下:
View Code
完毕。
思路:可借助另外一个栈来完成排序。
1、从原始栈里依次弹出元素放入辅助栈;
2、每当将要压入的元素是得辅助栈不是升序排列,就将辅助栈里面的元素重新压入原始栈中;
3、直到辅助栈里面的元素都小于当前要压入的元素;
4、压入当前的元素。
代码如下:
#include <iostream> #include <string> #include <stack> #include <stdlib.h> #include <time.h> using namespace std; template <typename T> class MQueue { public: MQueue() { } int size()const; bool empty()const { return size() == 0;} void push( const T &); const T front(); void pop(); private: stack<T> t1; //实现进“队”功能 stack<T> t2; //实现出“队”功能 }; template <typename T> int MQueue<T>::size()const { return t1.size() + t2.size(); } template <typename T> void MQueue<T>::push( const T &data) { t1.push(data); } template <typename T> const T MQueue<T>::front() { if( t2.empty())//如果t2为空,则将t1中的元素压入t2中 { while(!t1.empty()) { t2.push( t1.top()); t1.pop(); } } return t2.top();; } template <typename T> void MQueue<T>::pop() { if( t2.empty())//如果t2为空,则将t1中的元素压入t2中 { while(!t1.empty()) { t2.push( t1.top()); t1.pop(); } } t2.pop(); } int main(int argc, char const *argv[]) { MQueue<int> myq; for (int i = 0; i < 10; ++i) { myq.push(rand()%100); } cout << "Init size: " << myq.size() << endl; while( !myq.empty()) { cout << myq.front()<< " "; myq.pop(); } cout << endl; cout << "End size: " << myq.size() << endl; return 0; }
View Code
完毕。
相关文章推荐
- 堆排序的应用之优先级队列的实现
- 堆排序应用之优先队列的实现
- UNIX环境下如何应用消息队列实现进程间通信
- 用DBGrid控件配合数据集组件的Sort属性实现“点击标题栏自动排序功能”。
- ListView列排序功能实现
- UNIX环境下如何应用消息队列实现进程间通信
- 企业级服务器设计与实现经验之系统框架(二)--功能/应用服务器主体框架
- xml应用(3):附带选择功能的树的实现 XMLSelTree(V1.0)
- 实现Repeater控件点击表头排序功能
- 在C#中实现对ListView点击列标题自动排序功能
- 在C#中实现对ListView点击列标题自动排序功能
- 动态创建DataGrid 列排序功能的实现
- 应用RMS实现用户自动登陆功能
- 应用RMS实现用户自动登陆功能
- 排序和查询列的用户定义功能的实现方法
- 应用框架的设计与实现——.NET平台(9 消息队列产品安装)
- 应用RMS实现用户自动登陆功能
- crystal report排序功能的实现
- 应用框架的设计与实现——.NET平台(9 消息队列服务代码分析)
- 实现MapQuest 功能中的ADO.NET应用