在数据结构中,在必要学习的几大结构最为经典的算法之一。下面我将对栈进行进一步的介绍:
限定仅在表尾进行插入和删除操作的线性表。
允许插入和删除的一端成为栈顶,另外一端成为栈底,不包含任何数据元素的栈称为空栈,
由于栈底是确定的,最先进栈的只能在栈底。
栈的存储结构
栈的插入操作,叫做进栈,也称为压栈,入栈。
栈的删除操作,叫做出栈,也有的叫做弹栈。
栈中的每个元素称为一个frame。而最上层元素称为top frame。栈只支持三个操作, pop, top, push。
pop取出栈中最上层元素,栈的最上层元素变为早先进入的元素。
top查看栈的最上层元素。
push将一个新的元素放在栈的最上层。
栈存在一定的抽象数据类型
对于栈存在两个存储结构–进栈跟出栈。
特点:
一、栈属于特殊的线性表(顺序表、链表),它在操作上有一些较为特殊的要求和限制,元素的要求为“后进先出”。
二、栈的表尾称为栈的栈顶(top),相应的表头称为栈底(bottom)
三、栈的操作只能在这个线性表的表尾进行。
栈的创建:
public class Stack {
public Node head;
public Node current;
//方法:入栈操作
public void push(int data) {
if (head == null) {
head = new Node(data);
current = head;
} else {
Node node = new Node(data);
node.pre = current;//current结点将作为当前结点的前驱结点
current = node; //让current结点永远指向新添加的那个结点
}
}
public Node pop() {
if (current == null) {
return null;
}
Node node = current; // current结点是我们要出栈的结点
current = current.pre; //每出栈一个结点后,current后退一位
return node;
}
class Node {
int data;
Node pre; //我们需要知道当前结点的前一个结点
public Node(int data) {
this.data = data;
}
}
public static void main(String[] args) {
Stack stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack.pop().data);
System.out.println(stack.pop().data);
System.out.println(stack.pop().data);
}
}
以下为队列:
队列是限定只能在表的一端进行插入,在表的另外一端进行删除的特殊的线性表。
特点:
一、队列是先进先出的线性表。
二、队列只允许在后端进行插入操作,在前端进行删除操作。
两者的区别:
一、在于队列只允许新数据在后端进行添加。
二、栈先进后出,队列先进后出。
一、队列的顺序存储实现:
1、入队:Enqueue
public void EnQueue(T item){
if(Size == items.Length){
ResizeCapacity(items.Length * 2);
}
items[tail] = item;
tail++;
size++;
}
2、出队:Dequeue
public T DeQueue()
{
if (Size == 0)
{
return default(T);
}
T item = items[head];
items[head] = default(T);
head++;
if (head > 0 && Size == items.Length / 4)
{
// 缩小数组容量
ResizeCapacity(items.Length / 2);
}
size–;
return item;
}
二、队列的链式存储实现
1、入队:Enqueue
public void EnQueue(T item)
{
Node oldLastNode = tail;
tail = new Node();
tail.Item = item;
if(IsEmpty())
{
head = tail;
}
else
{
oldLastNode.Next = tail;
}
size++;
}
在链表的末尾插入一个新节点,将原来的尾节点的Next指针指向新节点。
2、出队:Dequeue
public T DeQueue()
{
T result = head.Item;
head = head.Next;
size–;
if(IsEmpty())
{
tail = null;
}
return result;
}