栈是一种数据结构,在实际问题中有许多应用场景。
关于栈的知识:
1.栈遵循先入后出,后入先出的原则。
2.向栈中添加数据称为入栈,删除数据称为出栈。
3.栈中添加数据的一端称为栈顶,另一端称为栈底。
大致理解如图:
栈的实现:
栈的实现可分为两种:
1)数组实现:
我们可以用一个数组来模拟栈容器,用一个栈顶指针来完成入栈出栈的 *** 作。
当指针等于栈长度时,栈满;当指针等于负一时,栈空。
2)链表实现:
用链表的next指针指向上次入栈的元素,只需保存最后一次存入节点作为栈顶;
注意:用数组实现栈时,栈的大小为固定的,需预估计或栈满时扩容。
2.队列队列在我们实际生活有很多应用场景,类似于排队,先入先出。
队列的实现:
队列的实现也分为两种:
1)数组实现:
数组实现队列需要一点知识储备:数组环形存储数据。
当我们存储满数据时,如果想继续存储而不考虑之前存储的数据时,我们
可以继续从底部存储,如图:
其中 index = (index+1)%(int[].length);
当我们了解这种存储方式后,用数组实现队列就容易了许多。
用H表示队头,T表示队尾。
当T等于H时表示队列空;
当 (H+1)%(int[].length)等于T时,表示队列满。
如你所见,这种算法会浪费一个空间作为判断条件。但对于绝大多数情况下,
一个单位的空间所占空间并不会造成多大的浪费,重点是简单(其实我也没
想到不浪费的 :)。
这个的java代码实现为:
public class ArrQueue {
int it[];
int head = 0;
int tail = 0;
//无参构造,这里为了方便使用,声明数组长度加一。
//可以达到队列长度即为无参构造输入的length。
public ArrQueue(int length){
it = new int[length+1];
}
//入队列
public void enter(int i){
if(!isFull()) {
head = (head+1)%it.length;
it[head] = i;
}
else throw new RuntimeException("队列满!");
}
//出队列
public int out(){
if(!isEmpty()){
tail = (tail+1)%it.length;
return it[tail];
}
else throw new RuntimeException("队列空!");
}
public boolean isFull(){
return (head+1)%it.length == tail;
}
public boolean isEmpty(){
return head == tail;
}
}
2)链表实现:
队列链表实现即为正常链表实现,只需保存头节点做队头、尾节点作为队尾。
注意:
1.数组实现的队列,大小固定。
2.链表实现的队列虽然大小不限,但在实现的过程中需一直创建对象。
要注意垃圾清理和效率问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)