循环队列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
 
#define MaxSize 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char Stype;
 
typedef struct{
    char *base;
    int front;//头指针
    int rear;//尾指针
}SqQueue;
 
//循环队列的初始化
int InitQueue(SqQueue &q){//构造一个空队列q
    q.base=new char[MaxSize];//为队列分配空间
    if(!q.base)
    exit(OVERFLOW);//存储分配失败 退出
    q.front=q.rear=0;//头指针和尾指针置为0 队列为空
    return OK;
}
// 求循环队列的长度
int QueueLength(SqQueue q){
    return (q.rear-q.front+MaxSize)%MaxSize;
}
//循环队列的入队
int EnQueue(SqQueue &q,char e){
    if((q.rear+1)%MaxSize==q.front)
        return ERROR;
        q.base[q.rear]=e;//新元素插入队尾
        q.rear=(q.rear+1)%MaxSize;//尾指针加1
        return OK;
}
//循环队列的出队
int DeQueue(SqQueue &q ,char &e){
    if(q.front==q.rear)
        return ERROR;//队列为空 返回
        e=q.base[q.front];//取队首数据
        q.front=(q.front+1)%MaxSize;//头指针数据加1 表示头数据向后移了一位
        return OK;
}
 
//取循环队列的头元素
Stype GetHead(SqQueue q){
    if(q.front!=q.rear)//队列不为空
      return q.base[q.front];
}
 
 
int main(){
    int choose,flag=0;
    SqQueue Q;
    char e,j;
    cout << " 1.初始化\n ";
    cout << " 2.入队\n ";
    cout << " 3.读队头元素\n ";
    cout << " 4.出队\n ";
    cout << " 0.退出\n\n ";
    choose = -1;
    while (choose != 0) {
        cout << " 请选择: ";
        cin >> choose;
        switch (choose) {
        case 1://算法3.16 链队的初始化
            if (InitQueue(Q)) {
                flag = 1;
                cout << " 成功对队列进行初始化\n\n ";
            } else
                cout << " 初始化队列失败\n\n ";
            break;
        case 2: {//算法3.17 链队的入队
            fstream file;
            file.open("QNode.txt");
            if (!file) {
                cout << " 错误!未找到文件!\n\n " << endl;
                exit(ERROR);
            }
            if (flag) {
                flag = 1;
                cout << " 入队的元素依次为:\n ";
                while (!file.eof()) {
                    file >> j;
                    if (file.fail())
                        break;
                    else {
                        EnQueue(Q, j);
                        cout << j << "  ";
                    }
                }
                cout << endl << endl;
            } else
                cout << " 队列未建立,请重新选择\n\n ";
            file.close();
        }
            break;
        case 3://算法3.19 取链队的队头元素
            if (flag != -1 && flag != 0)
                cout << " 队头元素为:\n " << GetHead(Q) << endl << endl;
            else
                cout << " 队列中无元素,请重新选择\n " << endl;
            break;
        case 4://算法3.18 链队的出队
            cout << " 依次弹出的队头元素为:\n ";
            while (DeQueue(Q, e)) {
                flag = -1;
                cout << e << "  ";
            }
            cout << endl << endl;
            break;
        }
    }
    return 0;
}<br>循环队列秉承先进先出的原则,定义了 *base 存储数据的指针  front 指向队列的第一个元素 rear 指向队列的最后一个元素 插入一条数据 rear+1;<br>

 

posted on   VbisoWen  阅读(163)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
阅读排行:
· 本地部署 DeepSeek:小白也能轻松搞定!
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 如何基于DeepSeek开展AI项目
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

导航

统计

点击右上角即可分享
微信分享提示