java 栈和队列的模拟--java

栈的定义:栈是一种特殊的表这种表只在表头进行插入和删除操作。因此,表头对于栈来说具有特殊的意义,称为栈顶。相应地,表尾称为栈底。不含任何元素的栈称为空栈。 栈的逻辑结构:假设一个栈S中的元素为an,an-1,..,a1,则称a1为栈底元素,an为栈顶元 素。栈中的元素按a1 ,a2,..,an-1,an的次序进栈。在任何时候,出栈的元素都是栈顶元素。换句话说,栈的修改是按后进先出的原则进行的.因此,栈又称为后进先出(Last In First Out)表,简称为LIFO表。所以,只要问题满足LIFO原则,就可以使用栈。 notice:换句话说,栈就是可以一个元素进后,可以接着进行输出的表.java 模拟栈操作:
 1 package com.zsy.stack;
 2 /**
 3  * 栈 java 实现  先进后出
 4  * @author 偶my耶
 5  *
 6  */
 7 public class stack {
 8     private Object[] stack;
 9
10     //元素个数;
11     private int size;
12
13     //默认长度为10;
14     public stack(){
15         this(10);
16     }
17
18     //也可以自己设置长度,即容量;
19     public stack(int len){
20         stack = new Object[len];
21     }
22
23     //返回元素个数;
24     public int size(){
25         return size;
26     }
27
28     //返回数组长度,即容量;
29     public int capacity(){
30         return stack.length;
31     }
32
33     //实现动态的数组;
34     public void ensureCapacity(){
35         if(size() == capacity()){
36             Object[] newStack = new Object[size() * 3 / 2 + 1];
37             System.arraycopy(stack, 0, newStack, 0, size());
38             stack = newStack;
39         }
40     }
41
42     //入栈;
43     public void push(Object o){
44         size++;
45         ensureCapacity();
46         stack[size - 1] = o;
47     }
48
49
50
51     //判空;
52     public boolean isEmpty(){
53         return size == 0;
54     }
55
56     //出栈;
57     public Object pop(){
58         //首先要判空;
59         if(isEmpty()){
60             throw new ArrayIndexOutOfBoundsException("不能为空");
61         }
62
63         Object o = stack[--size];
64         stack[size] = null;
65         return o;
66     }
67
68
69     public static void main(String[] args) {
70         stack stack = new stack(3);
71         String[] data = new String[] { "a", "b", "c1" ,"f2","s3", "a4", "b5", "c6" , "a7", "b", "c" };
72         for(String i:data)
73         {    stack.push(i);
74             System.out.print(i + "\t");
75         }
76
77         System.out.println("\n***********************************");
78         while (!stack.isEmpty()) {
79             System.out.print(stack.pop() + "\t");
80         }
81         //}
82     }
83 } 

运行效果:

队列
  在java5中新增加了java.util.Queue接口,用以支持队列的常见操作。该接口扩展了java.util.Collection接口。
Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优
点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用
element()或者peek()方法。
值得注意的是LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

java代码模拟:

 1 package com.zsy.stack;
 2 /**
 3  *     java 队列实现 先进先出
 4  * @author 偶my耶
 5  *
 6  */
 7 public class Queue {
 8
 9             private int maxSize; //队列长度,由构造函数初始化
10             private long[] queArray; // 队列
11             private int front; //队头
12             private int rear; //队尾
13             private int nItems;  //元素的个数
14
15             public Queue(int s)           // 构造函数
16                {
17                maxSize = s;
18                queArray = new long[maxSize];
19                front = 0;
20                rear = -1;
21                nItems = 0;
22                }
23
24             public void insert(long j)    // 进队列
25                {
26                if(rear == maxSize-1)          // 处理循环
27                   rear = -1;
28                queArray[++rear] = j;          // 队尾指针加1,把值j加入队尾
29                nItems++;
30                }
31
32             public long remove()          // 取得队列的队头元素。
33                {
34                long temp = queArray[front++]; // 取值和修改队头指针
35                if(front == maxSize)            // 处理循环
36                   front = 0;
37                nItems--;
38                return temp;
39                }
40
41             public long peekFront()       // 取得队列的队头元素。该运算与 remove()不同,后者要修改队头元素指针。
42                {
43                return queArray[front];
44                }
45
46             public boolean isEmpty()     // 判队列是否为空。若为空返回一个真值,否则返回一个假值。
47                {
48                return (nItems==0);
49                }
50
51             public boolean isFull()      // 判队列是否已满。若已满返回一个真值,否则返回一个假值。
52                {
53                return (nItems==maxSize);
54                }
55
56             public int size()            // 返回队列的长度
57                {
58                return nItems;
59                }
60         public static void main(String[] args)
61            {
62             Queue theQueue = new Queue(5);   // 队列有5个元素
63
64            theQueue.insert(10);             // 添加4个元素
65            theQueue.insert(20);
66            theQueue.insert(30);
67            theQueue.insert(40);
68
69            theQueue.remove();               // 移除3个元素
70            theQueue.remove();               // (10, 20, 30)
71            theQueue.remove();
72
73            theQueue.insert(50);             // 添加4个元素
74            theQueue.insert(60);
75            theQueue.insert(70);
76            theQueue.insert(90);
77            while( !theQueue.isEmpty() )     // 遍历队列并移除所有元素
78               {
79               long n = theQueue.remove();   // (40, 50, 60, 70, 80)
80               System.out.print(n);
81               System.out.print(" ");
82               }
83            System.out.println("");
84            }
85 }

运行效果:

时间: 2024-10-10 16:46:19

java 栈和队列的模拟--java的相关文章

HDU 1702 ACboy needs your help again! (栈和队列的模拟)

ACboy needs your help again! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3164    Accepted Submission(s): 1655 Problem Description ACboy was kidnapped!! he miss his mother very much and is ve

数据结构学习--Java栈和队列

栈:先进后出 队列:先进先出 都是数组存放,但是删除的时候不是删除了数组中的数据,而是使用增加游标标识的方式实现删除,“游标标识”加加或者减减完成删除操作,查看的时候,也不是直接查看栈和队列的数组元素,而是使用游标的方式向外查看. 栈的实现 package com.example.deer; public class MyStack { private long[] arr; private int top; /** * 默认构造函数 */ public MyStack(){ arr = new

数据结构与算法分析java——栈和队列1

1. 栈 1.1 分类 顺序栈:顺序线性表实现 链式栈:单向链表存储堆栈 1.2栈的应用 1)数制转换 import java.util.Scanner; import java.util.Stack; public class Tran{ public static void main(String arg[]){ Scanner y=new Scanner(System.in); System.out.println("请输入十进制数"); int b=y.nextInt(); T

疯狂Java——栈和队列(第10章)

栈(stack)代表一种特殊的线性表,这种线性表只能在固定一端(通常是尾端)进行插入.删除操作. 进栈:1)让top引用指向新添加的元素,新元素的next引用指向原来的栈顶元素: 2)让记录栈内元素个数的size变量加1. 出栈:1)让top引用指向原栈顶元素的下一个元素,并释放原来的栈顶元素: 2)让记录栈内元素个数的size变量减1. 队列(Queue)是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,只允许在表的后端(rear)进行插入操作.进行插入操作的端称为队尾,进行删

数据结构之栈和队列及其Java实现

栈和队列是数据结构中非常常见又非常基础的线性表,在某些场合栈和队列使用很多,因此本篇主要介绍栈和队列,并用Java实现基本的栈和队列,同时用两个栈实现队列和用两个队列实现栈. 栈:栈是一种基于"后进先出"策略的线性表.在插入时(入栈),最先插入的元素在栈尾,最后插入的元素在栈顶:在删除时(出栈),最后插入的元素先出栈,最先插入的元素最后出栈.由此可见,对栈的插入和删除操作都是在栈顶位置进行的. 在Java中,提供了一个类Stack<E>来实现栈的这些特性,并提供了一些常用的

(hdu step 8.1.1)ACboy needs your help again!(STL中栈和队列的基本使用)

题目: ACboy needs your help again! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 73 Accepted Submission(s): 57   Problem Description ACboy was kidnapped!! he miss his mother very much and is very

自己设置的纸牌游戏(简单数组栈和队列的设计)

星期天小白与小婷约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏--"小猫钓鱼".游戏的规则是这样的:将一副扑克牌平均分成俩份,每人拿一份.小白先拿出手中的第一张扑克牌放在桌上,然后小婷也拿出手中的第一张扑克牌,并放在小白刚打出的扑克牌上面,就像这样俩人交替出牌.出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将俩张相同的牌以及中间所夹着的牌全部取走,并依次放到自己手中牌的末尾.当任意一个人的牌全部出完时,游戏结束,对手获胜! 现在,我为了方便测试只涉及一组数据,因为数据如果不对的

【Java】 剑指offer(8) 用两个栈实现队列

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集  题目 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 思路 这道题较简单,自己先试着模拟一下插入删除的过程(在草稿纸上动手画一下):插入肯定是往一个栈stack1中一直插入:删除时,直接出栈无法实现队列的先进先出规则,这时需要将元素从stack1出栈,压到另一个栈stack2

剑指Offer-5.用两个栈实现队列(C++/Java)

题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 分析: 栈的特点是先进后出,队列的特点则是先进先出. 题目要求我们用两个栈来实现一个队列,栈和队列都有入栈(入队)的操作,所以我们可以使用一个栈来模拟入队的操作,另一个栈用来负责出队. 利用stack1模拟入队操作,stack2模拟出队操作. 当有元素入队时,就直接压入stack1中,当要出出队时,stack1中元素弹出的顺序和要求出队的顺序是正好相反的,我们可以将stack1的元素依次弹出,再压入st