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

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

栈的应用——对栈排序、用栈实现队列的功能的相关文章

用结点实现链表LinkedList,用数组和结点实现栈Stack,用数组和结点链表实现队列Queue

一,用结点实现链表LinkedList,不用换JavaAPI的集合框架 import java.util.Scanner; public class Main { public static class Node { int data; Node next=null; public Node(int data){this.data=data;}; } public static class MyLinkedList { Node head=null; public MyLinkedList()

两个栈实现队列的功能

//用两个栈实现队列的功能 //假设有两个栈s1与s2,则s1保存刚刚入队的元素,若需出队且s2为空,则将s1所有元素压入s2(此时s2中元素顺序为元素入队顺序),然后取出s2栈顶即可,若s2非空(此时s2中元素为s1之前压入,其栈顶就是最早入队的元素),则直接取出s2的栈顶. template<class T> class MyQueue { stack<T> s1,s2; public: MyQueue(){} int size() { return s1.size()+s2.

堆和栈的区别以及衍生出来的栈的效率为什么比堆高

栈与堆都是Java用来在Ram中存放数据的地方. 栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char). 存在栈中的数据可以共享.栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享.但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性. 堆是一个运行时数据区,类的(对象从中分配空间.由于要在运行时动态分配内存,存取速度较慢. 存在栈中的数据可以共享. 栈是编译时分配空间,而堆是动态分配(运行时

多栈共享技术,双端栈的初始化、进栈、出栈操作

栈的应用非常广泛,经常会出现一个程序中需要同时使用多个栈的情况.若使用顺序栈,会因为对栈空间大小难以准确估计,从而产生有的栈溢出.有的栈空间还很空闲的情况.为了解决这个问题,可以让多个栈共享一个足够大的数组空间,通过利用栈的动态特性来使其存储空间互相补充,这就是多栈的共享技术. 在顺序栈的共享技术中,最常用的是两个栈的共享技术,即双端栈.它主要利用了栈的栈底位置不变,而栈顶位置动态变化的特性. 实现代码如下: #include<iostream> using namespace std; #d

元素出栈,入栈顺序的合法性。如入栈的序列(1,2,3,4,5)。出栈序列为(4,5,3,2,1)

元素出栈,入栈顺序的合法性.如入栈的序列(1,2,3,4,5).出栈序列为(4,5,3,2,1) 思路: 1)如果当前栈为空,且入栈序列不空,则入栈序列的下一个元素入栈: 2)如果当前辅助栈的栈顶元素不等于出栈序列的首元素,那么入栈序列一直入栈,直到入栈序列为空. 3)如果当前辅助栈的栈顶元素等于出栈序列的首元素,那么栈顶元素弹出,出栈序列第一个元素移走: 4) 如果入栈序列为空,出栈序列第一个元素仍然不等于栈顶元素,则表示2个序列是不匹配的. 下面用图说明 开始栈为空 入栈序列第一个元素入栈后

判断出栈序列是否可能是某个入栈序列的出栈序列,C++

主要思想栈必须满足先进后出的规则,例如: 压入序列1,2,3,4,5 出栈序列4,3,5,1,2 设定一个Max值代表目前已经出栈的压入序列索引号最大的值 如当4出栈的时候,目前Max是4,当3出栈的时候,就查看3,4是否出栈,如果出栈就正确 当1出栈的时候,目前Max是5,就查看1~5时候出栈,这时候2还没有出栈就认为这个出栈序列不符合先进后出 #include<iostream>#include<map>#include<vector>#include<mem

栈和队列----用递归函数和栈的操作实现逆序一个栈

用递归函数和栈的操作实现逆序一个栈 一个栈依次压入1.2.3.4.5,那么从栈顶到栈底分别为5.4.3.2.1,将这个栈转置后,从栈顶到栈底为1.2.3.4.5,也就是实现栈中元素的逆序,但是只能使用递归函数来实现,不能实现其他数据结构. package com.test; import java.util.Stack; /** * Created by Demrystv. */ public class ReverseStack { //将栈stack的栈底元素返回并且删除 private s

我的全栈之路-Java架构师技术栈

我的全栈之路-Java架构师技术栈 我的全栈之路 JavaSE篇 Java概述与开发环境搭建 Java数据存储 Java数据计算 Java程序流程控制 Java数组 Java面向对象程序设计(上) Java面向对象程序设计(中) Java面向对象程序设计(下) Java常用API 集合 泛型 异常处理 注解 IO/BIO/NIO AIO网络框架tio设计与实现 多线程 网络编程 反射和动态代理 日志 XML 正则表达式 Java语言新特性实践 数据库编程(JDBC+MySQL) 数据结构 算法

【剑指offer】【栈】30.包含min函数的栈

包含min函数的栈 维护两个栈:栈st存储所有元素,minSt是一个单调栈,栈顶元素为min 1. 入栈:st.push(x); 若minSt.top >= x或minSt为空,x入栈minSt 2. 出栈:若minSt与st栈顶元素相同,则二者都出栈,否则st出栈 3. 获取最小值:若minSt不为空,返回minSt栈顶元素 class MinStack { public: stack<int> st; stack<int> minSt; /** initialize yo