算法设计-利用标记tag判别队列是否为空或满

假设一个数组squ[m]存放循环队列的元素,要使这个m个分量都得到利用,以设立标记tag为0或者1来区分尾指针和头指针值相同时队列的状态是空还是满。

思路:(rear+1)%m==front 则队列满,(front+1)%m==rear则队列空。队列开始为空,设tag=0。

int Algo(Queue Q,int m){

        int tag=0;                                         //初始队列为空

        if((S.rear+1)%m==S.front) tag=1;   //当队尾指针+1等于队头指针时,队满设tag为1

        if (( S.front+1)%m==S.rear) tag=0; //当队头指针+1等于队尾指针时,队空设tag为0

        return tag;

}//Algo

### 循环队列入队和出队操作 以下是基于循环数组实现的队列插入(`enqueue`)和删除(`dequeue`)算法,其中通过标志位 `tag` 来区分队列还是为。 #### 插入函数 (`enqueue`) 该函数用于向队列中插入元素。如果队列,则返回错误提示;否则将新元素加入到队尾并更新指针位置。 ```python def enqueue(Q, m, tag, rear, front): if (rear + 1) % m == front and tag == 1: # 判断队列是否 print("Queue is full!") return False, tag, rear Q[rear] = input_value # 假设input_value是要插入的数据 rear = (rear + 1) % m # 更新rear指针 if rear == front: tag = 1 # 设置tag=1表示当前队列可能了 return True, tag, rear ``` #### 删除函数 (`dequeue`) 该函数用于从队列头部移除元素。如果队列,则返回错误提示;否则取出队首元素并更新指针位置。 ```python def dequeue(Q, m, tag, rear, front): if front == rear and tag == 0: # 判断队列是否 print("Queue is empty!") return None, tag, front value = Q[front] front = (front + 1) % m # 更新front指针 if front == rear: tag = 0 # 设置tag=0表示当前队列可能是的 return value, tag, front ``` 以上代码实现了带有标志位 `tag` 的循环队列基本功能[^1]。 --- ### 数据输入处理逻辑 对于多组数据输入场景,可以按照如下方式解析输入: ```python while True: n, m = map(int, input().split()) # 输入n和m if n == 0 and m == 0: # 结束条件 break A = list(map(int, input().split()))[:n] # 获取入队序列A B = [] # 存储出队序列B的结果 # 初始化队列参数 queue_size = max(n, m) * 2 # 定义队列大小 Q = [None] * queue_size front = rear = 0 tag = 0 # 执行入队操作 for item in A: success, tag, rear = enqueue(Q, queue_size, tag, rear, front) # 执行出队操作并将结果存入B for _ in range(m): value, tag, front = dequeue(Q, queue_size, tag, rear, front) if value is not None: B.append(value) print(B) # 输出每次的操作结果 ``` 此部分代码展示了如何根据给定输入完成多次队列操作,并输出最终结果[^2]。 --- ### 使用计数器替代尾指针的方式 另一种方法是仅维护队头指针 `Front` 和一个计数变量 `Count` 表示队列中的元素数目。此时无需额外引入标记位 `tag` 即可判断队列的状态。 #### 入队函数 (`AddQ`) 当尝试添加新元素时,需先验证是否有足够的间容纳新增加的内容。 ```python def AddQ(Queue, size, Front, Count, X): if Count >= size: # 如果队列已经了则无法继续增加 return False Queue[(Front + Count) % size] = X Count += 1 return True ``` #### 出队函数 (`DeleteQ`) 执行删除动作前应确认是否存在有效节点可供弹出。 ```python def DeleteQ(Queue, size, Front, Count): if Count <= 0: # 若无任何成员存在于队列之中则报错退出 raise Exception("Cannot delete from an empty queue.") result = Queue[Front] Front = (Front + 1) % size Count -= 1 return result ``` 这种方法简化了传统双指针模型下的边界判定过程[^3]。 --- ### 总结说明 上述三种方案分别针对不同需求提供了灵活解决方案:第一种利用布尔型标签辅助判别极端情况;第二种采用动态调整策略适应更多实际应用场景;第三种优化存储管理减少冗余计算开销。开发者可根据具体项目背景选取最适配的技术路线加以实施部署。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值