这个问题总的栈和队列,没有自己手写,自己手写太浪费了,于是就用的java中的集合框架list下面的LinkedList

其实LinkedList既可以当做栈用,也可以当做队列来使用.

作为栈的时候,LinkedList<T> stack = new LinkedList<T>().入栈stack.push(e),出栈stack.pop()

作为队列时,LinkedList<T> queue = new LinkedList<T>(),入队queue.offer(e),出队,queue.poll()

(1)使用两个栈来实现队列先进先出的功能,思想很简单:

1)两个栈都空的时候,表示队列是空的

2)入队操作,stack1.push(e)即可

3)出队操作,首先要判断是不是空队。负责出队的是stack2,出队之前先判断stack2是不是空的,如果是空的话,先把stack1中的元素出站,并依次压入到stack2中,然后stack2弹出栈顶元素即可。

直接看代码吧:

 1 /**
 2  * 使用两个 栈实现一个队列的功能 堆成的另一个问题 使用 两个队列实现一个栈
 3  * @author Administrator
 4  *
 5  */
 6 public class StackQueue <T>{
 7     LinkedList<T> stack1;
 8     LinkedList<T> stack2;
 9
10     public StackQueue() {// 构造并初始化一个队列
11         stack1 = new LinkedList<T>();
12         stack2 = new LinkedList<T>();
13     }
14
15     /**
16      * 判断队列是否为空
17      * @return
18      */
19     public boolean isEmpty() {
20         if(stack1.isEmpty() && stack2.isEmpty())
21             return true;
22         else return false;
23     }
24
25     public int getLength()
26     {
27         return stack1.size() + stack2.size();
28     }
29
30     /**
31      * 入队操作
32      * @param e
33      */
34     public void offer(T e) {
35         // TODO Auto-generated method stub
36         stack1.push(e);
37     }
38
39     /**
40      * 出队操作
41      * @return
42      */
43     public T poll()
44     {
45         if(stack1.isEmpty() && stack2.isEmpty())
46             throw new RuntimeException(new Exception("queue is empty"));
47         else
48         {
49             if(stack2.isEmpty())//如果stack2empty要先把stack1中的元素出站并依次压入stack2
50             {
51                 while(stack1.isEmpty()==false)
52                 {
53                     stack2.push(stack1.pop());
54                 }
55             }
56             return stack2.pop();
57         }
58     }
59
60     public static void main(String[] args) {
61         StackQueue<Integer> sq = new StackQueue<Integer>();
62
63         System.out.println("sq is empty? :"+sq.isEmpty());
64
65         sq.offer(1);
66         sq.offer(2);
67         sq.offer(3);
68         sq.offer(4);
69         sq.offer(5);
70
71         System.out.println("sq.length : "+sq.getLength());
72         System.out.println("sq is empty? :"+sq.isEmpty());
73
74         while(!sq.isEmpty())
75         {
76             System.out.print(sq.poll()+",");
77         }
78         System.out.println();
79     }
80 }

(2)使用两个队列实现栈的先进后出的功能

1)两个队列都空的时候表明栈空

2)始终保持queue1为空,用来入栈,如果queue1不空,的话,可以把queue1中的元素依次出队并且依次进入到queue2队中,然后返回queue2的尾元即可。这里使用java的LinkedList可以取巧,具体可以直接看下卖弄的代码:

 1 /**
 2  * 使用两个队列 实现 队列的操作
 3  * 因为使用的是两个链队实现的 所以这个栈有空的时候,但是不需要判断满
 4  * @author Administrator
 5  *
 6  */
 7 public class QueueStack <T>{
 8     LinkedList<T> queue1 ;
 9     LinkedList<T> queue2 ;
10
11     public QueueStack() {    //初始化一个空队列
12         queue1 = new LinkedList<T>();
13         queue2 = new LinkedList<T>();
14     }
15
16     /**
17      * 判断是不是一个空栈
18      * @return
19      */
20     public boolean isEmpty()
21     {
22         if(queue1.isEmpty()&&queue2.isEmpty())
23             return true;
24         else
25             return false;
26     }
27
28     /*
29      * 获取栈的大小
30      */
31     public int getLength()
32     {
33         return queue1.size() + queue2.size();
34     }
35
36     /*
37      * 入栈操作 直接让元素进第一个队
38      */
39     public void push(T e)
40     {
41         queue1.offer(e);
42     }
43
44     /**
45      * 出站操作
46      * @return
47      */
48     public T pop()
49     {
50         LinkedList<T> tmp;    //始终保持让queue1 为空 准备入栈,让queue2完成出站
51
52         if(queue1.isEmpty() && queue2.isEmpty())
53         {
54             throw new RuntimeException(new Exception("stack is empty"));
55         }
56
57         if(!queue1.isEmpty()){
58             tmp = queue2;
59             queue2 = queue1;
60             queue1 = tmp;
61         }// 于是 queue1变成了 queue2,这样就可以再次入栈了,线面使用queue2实现出站
62
63         /*
64          * 出栈的操作就是把queue2中的 元素依次出去,最后剩一个元素 就是需要出站的元素,
65          * 这里可以取巧一下直接获取 queue2.last的元素作为返回值
66          */
67         T e = queue2.peekLast();
68         queue2.removeLast();
69         return e;
70     }
71
72     public static void main(String[] args) {
73         QueueStack<Integer> qs = new QueueStack<Integer>();
74
75         System.out.println("qs is empty?:"+qs.isEmpty());
76
77         System.out.println("push 1,2,3");
78
79         qs.push(1);
80         qs.push(2);
81         qs.push(3);
82
83         System.out.println("qs length :"+qs.getLength());
84         System.out.println("qs is enpty:"+qs.isEmpty());
85
86         System.out.print("pop one by one:");
87         while(!qs.isEmpty())
88         {
89             System.out.print(qs.pop()+",");
90         }
91         System.out.println();
92
93         qs.pop();
94
95     }
96 }

转载于:https://www.cnblogs.com/OliverZhang/p/6582198.html

用栈来表示队列,用队列来表示栈相关推荐

  1. 十、【栈和队列】队列

    队列 Queue 队列和栈一样,也属于受限线性表. 1 队列的基本概念 1.1 队列的定义 队列是只允许在表尾进行插入,表头进行删除的线性表.插入操作又称为入队,删除操作又称为出队. 队列的逻辑关系就 ...

  2. 栈和队列的Java实现_栈和队列的java简单实现

    栈:这是一个先进后出的数据结构,生活中类似的浏览器的返回上一页就可以利用此结构实现,代码如下: public class Stack{private Object[] data;//存储数据 priv ...

  3. 复习栈和队列,详解最小栈,栈的弹出压入序列,逆波兰表达式求值

    栈和队列的概念 栈:吃进去吐出来 对列:吃进去拉出来 数据结构中的栈和内存中的区别 数据结构中的栈具有后进先出的特性,而内存中的栈是一个内存空间,只不过这个内存空间具与数据结构的栈具有相同的特性. 栈 ...

  4. c++数据结构队列栈尸体_数据结构-第三章:栈和队列(栈的应用、括号匹配、表达式转换)...

    第三章:栈和队列 下面讲解栈的应用主要内容有:栈的应用.括号匹配.中 后 前 缀表达式转换 1.栈的应用 1.1括号匹配 我们在数学运算中 [(A+b)*c] - (E-F) 往往都会有[ ] 和 ( ...

  5. (王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀、中缀和后缀)

    前面我们就说过,栈是一种先进后出的线性表,这种先进后出的特性就决定了它在一类场合或问题中会经常被用到--递归.考研数据结构中所涉及的利用栈结构解决递归问题或者考察栈结构特性的问题主要有这么几类 括号匹 ...

  6. 利用栈和队列将队列中的元素逆置☆

    题目:有一个队列和一个栈,设计一个算法是队列中的元素逆置. 分析:         我们可以一次取出队列中的元素放到栈中,然后在依次取出入队. 代码: struct Stack {int* arr; ...

  7. 栈(Stack)与队列(Queue)

    定义 栈:后进先出(LIFO-last in first out):最后插入的元素最先出来. 队列:先进先出(FIFO-first in first out):最先插入的元素最先出来. 图示 在这里插 ...

  8. 栈实现队列(队列实现栈)

    <1>队列实现栈 代码实现 import java.util.LinkedList; import java.util.Queue;/*** 队列实现栈:* 方法:* 1.首先需要两个队列 ...

  9. java判断栈中元素数目_Java数据结构与算法-栈和队列

    (摘录加总结)------ 栈和队列不属于基础的数据结构,它们都属于线性表. 一.栈 对于栈存储操作元素只能在栈结构的一端进行元素的插入和删除,是一种性质上的线性表结构.按照"先进后出&qu ...

  10. Leetcode刷题笔记12:【20】有效的括号【155】最小栈【255】用队列实现栈(STL:stackC++ 单引号和双引号)

    第十天 2021-3-12 每日刷四题 刷题模块:栈 - 简单难度 一.STL:stack C++ stack(STL stack)用法详解 函数 方法 top() 返回一个栈顶元素的引用,类型为 T ...

最新文章

  1. [导入]源代码版本控制(一)
  2. ios 构建版本一直在处理中_iOS关于审核提交构建版本不显示问题集锦
  3. 13、logging模块
  4. dagger android 学习(二):AndroidInjector的使用
  5. Java 工具类 - MD5Util
  6. 蔚来汽车股票一日成交额达274亿美元 居美股榜首
  7. android车载娱乐系统场景,智能汽车、家庭娱乐系统、工业自动化场景中接口应用设计...
  8. Nebula Challenge 04
  9. 面试准备每日系列:Java底层源码——Arrays.toString(数组) object.toString() new String()
  10. postgresql分页用法_postgresql分页数据重复问题的深入理解
  11. C++ 柔性数组(转载)
  12. 一个故事讲完CPU的工作原理 侵删
  13. 适应智能工厂的新一代MES所需具备的核心要素
  14. 批量导入数据将word文档转换成HTML文档
  15. Typora DIY 主题背景,以及透明pre代码块。
  16. 星星之火-36:LTE载波载波的间隔是15K, 载波波的带宽是多少? 15K还是30K?
  17. Flash 的fla文件读写 可以直接更改图片路径
  18. python读取ymal文件
  19. Promise静态方法,then的顺延,resolve函数
  20. 申请coursera助学金模板转载

热门文章

  1. python not函数_python 函数
  2. python计算数据百分比_概率计算:定义概率分布数据结构,Python实现概率分布计算...
  3. python多态的概念_Python 多态
  4. java计数器策略模式_策略模式与外观模式 | 学步园
  5. 8g ubuntu 树莓派4b_3D 打印制造树莓派 4B 平板电脑
  6. 信号与系统 2022 春季学期第一次作业-作业题目准备
  7. 基于LM567制作的反射式红外检测电路,用于节能信标检测电路
  8. 将扫描字符转换成点阵信息
  9. LED的电流与光强之间的关系
  10. 第十五届智能车赛比赛 比赛组织参考文档