队列的顺序实现

队列的特点是先进先出,以下是队列的顺序实现,用数组完成。

//本例采用的是循环队列。
//front指示下一个出队列的元素位置
//front+size指示下一个入队列的元素位置
//因为采用循环队列,出去队列留出来的位置可作为以后入队列的元素存放的位置
//解决这种问题的方式可用%来实现
//用(front+1)%data.length;(front+size)%data.length分别来实现
//循环的问题
public class ArrayQueue<E> {
private E[] data=(E[]) new Object[10];
private int front=0;//出队列的位置
private int size=0;//加入的元素的个数
//入队列操作
public void add(E target){
//如果数组到极限,创建新数组,并拷贝原来元素到新数组中
if(size==data.length){
E[] tempdata=(E[])new Object[data.length+5];
//采用的是循环队列
for(int i=0;i<data.length;i++){
tempdata[i]=data[(front+i)%data.length];
}
data=tempdata;
front=0;
}
data[(front+size)%data.length]=target;
size++;
}
//判断是否为空
public boolean isEmpty(){
return size==0;
}
//出队列操作
public E remove(){
if(isEmpty()){
return null;
}else{
E temp=data[front];
front=(front+1)%data.length;
size--;
return temp;
}
}

}
队列顺序存储结构是一种基于数组实现队列方式,它通过两个指针 `front` 和 `rear` 来分别表示队列的头部和尾部。这种实现方式需要预先定义一个固定大小的数组来存储队列中的元素,并通过对指针的操作完成入队(插入)和出队(删除)操作。 ### 队列顺序存储实现方法 #### 1. 定义队列结构 通常使用一个结构体来包含队列的数据、队头指针和队尾指针: ```c #define MaxSize 10 // 定义队列的最大容量 typedef struct { int data[MaxSize]; // 存储队列元素的数组 int front; // 队头指针,指向第一个元素 int rear; // 队尾指针,指向下一个插入位置 } SqQueue; ``` #### 2. 初始化队列 初始化时,将 `front` 和 `rear` 均设置为 0,表示队列为空: ```c void InitQueue(SqQueue *Q) { Q->front = 0; Q->rear = 0; } ``` #### 3. 判断队列是否为空 当 `front` 和 `rear` 相等时,表示队列中没有元素: ```c int IsEmpty(SqQueue *Q) { return (Q->front == Q->rear); } ``` #### 4. 判断队列是否已满 为了避免假溢出问题,采用循环队列的方式进行判断。具体条件是:如果 `(rear + 1) % MaxSize == front`,则表示队列已满[^4]。 ```c int IsFull(SqQueue *Q) { return ((Q->rear + 1) % MaxSize == Q->front); } ``` #### 5. 入队操作 将元素添加到队列尾部,并更新 `rear` 指针。注意在入队前需要检查队列是否已满: ```c int EnQueue(SqQueue *Q, int x) { if (IsFull(Q)) { return 0; // 队列已满,无法入队 } Q->data[Q->rear] = x; Q->rear = (Q->rear + 1) % MaxSize; // 更新队尾指针 return 1; } ``` #### 6. 出队操作 从队列头部移除一个元素,并更新 `front` 指针。出队前需检查队列是否为空: ```c int DeQueue(SqQueue *Q, int *x) { if (IsEmpty(Q)) { return 0; // 队列为空,无法出队 } *x = Q->data[Q->front]; Q->front = (Q->front + 1) % MaxSize; // 更新队头指针 return 1; } ``` #### 7. 获取队头元素 不移除队头元素,仅读取其值: ```c int GetFront(SqQueue *Q, int *x) { if (IsEmpty(Q)) { return 0; // 队列为空,无法获取队头元素 } *x = Q->data[Q->front]; return 1; } ``` #### 8. 遍历输出队列 遍历队列中的所有元素并输出: ```c void PrintQueue(SqQueue *Q) { int i = Q->front; while (i != Q->rear) { printf("%d ", Q->data[i]); i = (i + 1) % MaxSize; } printf("\n"); } ``` #### 9. 销毁队列 由于使用的是静态数组,销毁操作通常是释放动态分配的内存(如果有)。在这个示例中,可以简单地将其置空或重置指针。 ### 总结 队列顺序存储实现方法简单直观,但需要注意以下几点: - **假溢出问题**:如果不采用循环队列的方式,可能会出现队列未满但无法继续入队的情况[^2]。 - **空间限制**:队列的大小受限于数组的大小,若采用动态扩容,则会增加实现复杂度和性能开销[^2]。 - **牺牲一个存储单元**:为了区分队列为空和队列为满的状态,通常需要牺牲一个存储单元[^4]。 通过上述步骤,可以完整实现一个基于顺序存储结构的队列
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值