数据结构栈和队列总结
转http://blog.csdn.net/mageshuai/article/details/3851172
栈与队列更多的作为程序员的工具来使用,构思算法的辅助工具,而数组、链表等是作为数据存储工具,适用于数据库应用中做数据记录,但栈与队列不是完全的数据存储工具,他们的生命周期比较短,在程序操作执行期间他们才被创建,在完成任务后就被销毁。
栈与队列的访问是受限制的,即在特定时刻只有一个数据项可以被读取或被删除。
他们可以用数组或链表来实现,比数组、链表更加抽象。
Stack
在解析算数表达式方面的应用
对分隔符的匹配验证
大部分微处理器运用基于栈的体系结构
方法:push pop peek
Top指针,指向栈顶元素
public void push(long d) {
arrayStack[++top] = d;
}
public long pop {
return arrayStack[top--];
}
当栈是由数组实现的,需要先指定栈的大小。
入栈 出栈 O(1)
Queue
FIFO 先进先出
模拟排队,网络上数据的传递
队头(front)和队尾(rear)两个指针
队列中的数据项不总是从数组的0下标处开始
效率的提高:循环队列 指针移动 环绕式处理 (避免队列不满却不能插入新数据项的问题)
方法:
insert(long i ) {
if (rear == maxsize-1) rear=-1
arrayQue[ ++rear] = i;
}
remove() {
temp = arrayQue[front++] ;
if (front == maxsize) front = 0;
}
注意在插入和删除之前要判断队列是否为满或空
有两种判断方法:
1、通过一个数据项计数变量 nItems
2、通过front和rear来计算。 在同一时间,通过front和rear的位置来判断,队列可能是满的,也可能是空的。
→→解决方法:让数组容量比队列数据项个数的最大值还要大一,
isEmpty rear+1 == front | | front + maxsize -1 == rear
isFull rear + 2 - maxsize = front || rear +2 == front
即队列的容量为maxsize-1
插入与删除操作的时间复杂度均为O(1)