一、栈(stack)
栈只允许访问一个数据项:即最后插入的数据项,删除这个数据项后才能访问到倒数第二个插入的数据项。实现后进先出(LIFO) 的功能。它可以用来检验源程序中的大小中括号是否匹配、解析算术表达式等问题。
邮政模拟例
许多人在工作收到信后,会随手将它放在大厅桌子上的信堆上,等有空的时候就会从上到下处理这些堆积的邮件,这些人的邮件系统就如计算机中的栈。如果他们不遵循这种从上到下的顺序,而先拿堆底的邮件,从下到上,这就和计算机中的优先级队列结构相似。
栈的定义
(1)通常称插入、删除的这一端为栈顶(Top),另一端称为栈底(Bottom)。
(2)当表中没有元素时称为空栈。
(3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表。
栈的修改是按后进先出的原则进行。每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除。
(1)通常称插入、删除的这一端为栈顶(Top),另一端称为栈底(Bottom)。
(2)当表中没有元素时称为空栈。
(3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表。
栈的修改是按后进先出的原则进行。每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除。
Stack主要功能
Push(入栈:压入栈顶)
Pop(出栈:移除栈元素)
Peek(查看栈顶元素)是栈的最主要的操作。
栈的操作图如下:
package com.wei;
public class Stack
{
private int maxSize; // size of stack array
private long[] stackArray; //使用数组实现栈。
private int top; // top of stack,栈项数组下标
public Stack(int maxSize)
{
this.maxSize = maxSize;
stackArray = new long[maxSize];
top = -1;
}
public void push(long value) throws Exception
{
if( isFull() )
throw new Exception("Array is full,cannot be push");
stackArray[++top] = value;
}
public long pop() throws Exception
{
if( isEmpty() )
throw new Exception("Array is isEmpty,cannot be pop");
else
return stackArray[top--];
}
public long peek() throws Exception
{
if( isEmpty() )
throw new Exception("Array is isEmpty,cannot be pop");
return stackArray[top];
}
public Boolean isFull()
{
return (top == maxSize-1);
}
public Boolean isEmpty()
{
return (top == -1);
}
}
栈的实例1:单词逆序
栈的实例2:分隔符匹配
二、队列(queue)
队列定义
队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表
(1)允许删除的一端称为队头(top)。
(2)允许插入的一端称为队尾(bottom)。
(3)当队列中没有元素时称为空队列。
(4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表。
队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表
(1)允许删除的一端称为队头(top)。
(2)允许插入的一端称为队尾(bottom)。
(3)当队列中没有元素时称为空队列。
(4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表。
Queue主要功能
Insert(入栈:压入栈顶)
Remove(出栈:移除栈元素)
Peek(查看栈顶元素)是栈的最主要的操作。
队列的操作图示:
![Data <wbr>Structures <wbr>& <wbr>Algorithms <wbr>in <wbr>Java <wbr>4栈和队列 Data <wbr>Structures <wbr>& <wbr>Algorithms <wbr>in <wbr>Java <wbr>4栈和队列](https://i-blog.csdnimg.cn/blog_migrate/54677073acd380ac3ffc1fe3b55f98df.jpeg)
环绕式处理
队列的Java代码
package com.wei;
public class Queue
{
private int maxSize; //数组长度
private long[] queArray;
private int top; //队头指针
private int bottom; //队尾指针
private int nItems; //个数
public Queue(int maxnum)
{
this.maxSize = maxnum;
queArray = new long[maxSize];
top = 0;
bottom = -1;
nItems = 0;
}
public void insert(long value) throws Exception
{
if( isFull() )
throw new Exception("queArray is full!");
if(bottom == maxSize-1) //循环位置
bottom = -1;
queArray[++bottom] = value;
nItems++;
}
public long remove() throws Exception
{
if( isEmpty() )
throw new Exception("queArray is empty!");
long temp=queArray[top++];
nItems--;
if(top==maxSize) //循环位置
top=0;
return temp;
}
public long peek() throws Exception
{
if( isEmpty() )
throw new Exception("queArray is empty!");
return queArray[top];
}
public Boolean isFull()
{
return (nItems == maxSize);
}
public Boolean isEmpty()
{
return (nItems == 0);
}
}
队列的效率
三、优先级队列
优先级队列的效率