Java数据结构与算法之栈和队列

来源:互联网 发布:在领军教育上班 知乎 编辑:程序博客网 时间:2024/05/14 21:36

    此类数据结构和算法更多是作为程序员的工具来运用。他们主要作为构思算法的辅助工具,而不是完全的数据存储工具。这些数据结构的生命周期比那些数据库类型的结构要短得多。在程序操作执行期间它们才被创建,通常用它们去执行某项特殊任务,当完成任务之后,它们就被销毁。

    两个特点:

    1、访问受限

    访问是受限制的,即在特定时刻只有一个数据项可以被读取或者被删除。

    2、更加抽象

    栈、队列和优先级队列是比数组和其他数据存储结构更为抽象的数据结构,主要通过接口对栈、队列和优先级队列进行定义,这些接口表明他们可以完成的操作,而它们的主要实现机制对用户来说是不可见的。

    一、栈  

    特点:

    1、栈只允许访问一个数据项,即最后插入的数据项。移除这个数据项后才能访问倒数第二个插入的数据项,依此类推。

    2、大部分微处理器运用的是基于栈的体系结构。当调用一个方法时,把它的返回地址和参数压入栈,当方法结束返回时,那些数据出栈。栈操作就嵌入在微处理器中。

    3、栈可以由不同的数据结构来实现,比如数组,比如链表。

    4、Stack LIFO 后进先出。

    注意:不要把栈的概念和实现它的内部数据结构混为一谈。

    以下为用数组实现栈:

/** * 栈的实例 * @author wuweizi * */public class StackX {private int maxSize;private long [] stackArray;private int top;//....................................................public StackX(int s) {super();this.maxSize = s;this.stackArray = new long[maxSize];this.top = -1;}//....................................................public void push(long j){//attention! first point addself,and then insert data//写英语注释真憋屈,直接一点吧!此行代码的意思是,先开辟一片空间,然后再往里添加数据stackArray[++top] = j;}//....................................................public long pop(){//attention! first remove data,postfix decrement//此行代码的意思是,先把数据项移走,然后把此片空闲空间回收!你住着我的房子不走,我怎么把房子收回来啊!return stackArray[top--];}public long peek(){return stackArray[top];}//....................................................public boolean isEmpty(){return top == -1;}//....................................................public boolean isFull(){return top == maxSize - 1;}    public static void main(String[] args) {StackX theStack = new StackX(10);//make new stacktheStack.push(20);theStack.push(40);theStack.push(60);theStack.push(80);while(!theStack.isEmpty())//until its empty{                         //delete item from stack,is not really deletelong value = theStack.pop(); System.out.println(value);//display itSystem.out.println("");}System.out.println("");}}

    以下为用链表实现栈:

/** * 节点类 * @author Administrator * */class Link {public long dData;//声明了long数据类型变量public Link next;//声明了Link数据类型对象//构造方法,初始化dDatapublic Link(long dd) {this.dData = dd;}//链表展示方法,将dData显示出来public void displayLink(){System.out.println(dData+"");}}/** * 链表类 * @author Administrator * */class LinkList{private Link first;//声明first节点/** * 初始化first节点 * @param first */public LinkList(Link first) {this.first = null;}/** * 判断first节点是否为空 * @return */public boolean isEmpty(){return first==null;}/** * 添加节点,然后first节点与新节点互换位置 * @param dd */public void insertFirst(long dd){Link newLink = new Link(dd);newLink.next=first;first = newLink;}/** * 删除节点,将first节点归还于链表类 * @return */public long deleteFirst(){Link temp = first;first = first.next;return temp.dData;}public void displayList(){Link current = first;while(current!=null){current.displayLink();current = current.next;}System.out.println("");}}/** * 链表栈类 * @author Administrator * */class LinkStack{private LinkList theList;public LinkStack(LinkList theList) {this.theList = new LinkList(null);}public void push(long j){theList.insertFirst(j);}public long pop(){return theList.deleteFirst();}public boolean isEmpty(){return theList.isEmpty();}public void displayStack(){System.out.println("Stack(top-->bottom):");theList.displayList();}}
/** * 栈应用程序类 * @author Administrator * */public class LinkStackApp {public static void main(String[] args) {LinkStack theStack = new LinkStack(null);theStack.push(20);theStack.push(40);theStack.displayStack();theStack.push(60);theStack.push(80);theStack.displayStack();theStack.pop();theStack.pop();theStack.displayStack();}}

    二、队列

    队列是一种数据结构,有点类似栈,只是在队列中第一个插入的数据项也会最先被移除(先进先出FIFO),而在栈中,最后插入的数据项最先移除(LIFO)。

    以下为用数组实现队列:

<pre name="code" class="java">/** * 队列的实例 * @author wuweizi * */public class Queue {private int maxSize;private long [] queArray;private int front;private int rear;private int nItems;public Queue(int s){maxSize = s;//数组大小queArray = new long[maxSize];//创建一个数组front = 0;//队头下标rear = -1;//队尾下标nItems = 0; //数据项个数}public void insert(long j){//当队尾下标值达到最大值的时候,我们设置队尾下标为-1if (rear == maxSize-1) {rear = -1;}queArray[++rear] = j;nItems++;}public long remove(){long temp = queArray[front++];if (front==maxSize) {front = 0;}nItems--;return temp;}    public long peekFront(){return queArray[front];}    public long peekRear(){return queArray[rear];}public boolean isEmpty(){return nItems == 0;}public boolean isFull(){return nItems == maxSize;}public int size(){return nItems;}}public class QueueApp {public static void main(String[] args) {Queue theQueue = new Queue(5);theQueue.insert(10);theQueue.insert(20);theQueue.insert(30);theQueue.insert(40);System.out.println(theQueue.remove());System.out.println(theQueue.remove());System.out.println(theQueue.remove());theQueue.insert(50);theQueue.insert(60);theQueue.insert(70);theQueue.insert(80);while(!theQueue.isEmpty()){long n = theQueue.remove();System.out.println(n);System.out.println(" ");}System.out.println(" ");}}

    以下为用链表实现队列:

/** * 节点类 * @author Administrator * */class Link {public long dData;//声明了long数据类型变量public Link next;//声明了Link数据类型对象//构造方法,初始化dDatapublic Link(long dd) {this.dData = dd;}//链表展示方法,将dData显示出来public void displayLink(){System.out.println(dData+"");}}/** * 队列两头类 * @author Administrator * */class FirstLastList{private Link first;private Link last;public FirstLastList(Link first, Link last) {this.first = null;this.last = null;}public boolean isEmpty(){return first==null;}public void isnertLast(long dd){Link newLink = new Link(dd);if (isEmpty()) {first = newLink;}else {last.next = newLink;}last = newLink;}public long deleteFirst(){long temp = first.dData;if (first.next==null) {last = null;}first = first.next;return temp;}public void displayList(){Link current = first;while(current!=null){current.displayLink();current = current.next;}System.out.println("");}}/** * 链表实现的队列类 * @author Administrator * */class LinkQueue{private FirstLastList theList;public LinkQueue(FirstLastList theList) {this.theList = new FirstLastList(null, null);}    public boolean isEmpty(){return theList==null;}public void insert(long j){theList.isnertLast(j);}public long remove(){return theList.deleteFirst();}public void displayQueue(){System.out.println("Queue(front-->rear)");theList.displayList();}}
/** * 栈应用程序类 * @author Administrator * */public class LinkQueueApp {public static void main(String[] args) {LinkQueue theQueue = new LinkQueue(null);theQueue.insert(20);theQueue.insert(40);theQueue.displayQueue();theQueue.insert(60);theQueue.insert(80);theQueue.displayQueue();theQueue.remove();theQueue.remove();theQueue.displayQueue();}}

    三、栈和队列的区别

    1、队列先进先出,栈先进后出

    2、栈是限定只能在表的一端进行插入和删除操作的线性表;队列限定只能在表的一端进行插入和在另一端进行删除操作的线性表

    3、数据元素之间的关系相同,但数据类型却完全不同

    4、遍历速度不同,栈只能从头部取数据 也就最先放入的需要遍历整个栈最后才能取出来,而且在遍历数据的时候还得为数据开辟临时空间,保持数据在遍历前的一致性列怎不同,他基于地址指针进行遍历,而且可以从头或尾部开始遍历,但不能同时遍历,无需开辟临时空间,因为在遍历的过程中不影像数据结构,速度要快的多

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 色选大米带出比大怎么办? 做手足印如果漆刷到外面了怎么办 小区房子整租给民工影响邻居怎么办 种植牙植体中间的螺丝滑丝怎么办 宝宝1岁了牙齿表面脱落了怎么办 1岁3个月宝宝牙齿发黑脱落怎么办 种植牙中央螺栓断在牙根里怎么办 欧联杯冠军已经获得欧冠资格怎么办 孩子该上学了学校不收怎么办 帮室友带东西她忘给钱怎么办? 鸿合录播系统不会自动跟踪了怎么办 小米2s锁屏密码忘了怎么办 想用中国驾照去美国开车怎么办? 5座的车坐7个人怎么办 海尔电视机的设置调乱了怎么办 老公弟兄两个有个偏心的婆婆怎么办 农商银行u盾密码忘了怎么办 不熟的表弟表妹向你借钱怎么办 开货车撞到人家房子了怎么办 坐骨被摔跤后好多年没好怎么办 自动挡汽车电子手刹刹车失灵怎么办 买家拍了不包邮的宝贝付款了怎么办 包邮快递买家不要了运费怎么办 舞蹈劈叉练出肌肉劈不下去怎么办 腰间盘突出压迫神经腿疼怎么办盘 绑定了我身份证的微信被盗了怎么办 用身份证办的手机卡不用了怎么办 平安陆金所交易密码忘了怎么办 陆金所密码交易密码忘记怎么办 带介指手指月肿了拿不下来怎么办 老公搞建筑的要长期在外地怎么办 媳妇跟婆婆吵架老公帮婆婆该怎么办 在家里礼佛香炉剩下的香头怎么办 精索曲张最近一打篮球就蛋疼怎么办 都两天了快递还是显示已发货怎么办 中通快递到达一天就是不派送怎么办 顺丰派送员把快递寄错了怎么办 顺丰快递把户籍卡弄丢了怎么办 金立手机不小心设置成英文了怎么办 三星手机不小心设置成英文了怎么办 手游方舟国际版渡渡鸟跟丢了怎么办