c语言程序结构环形队列入队,C语言 环形队列

112164205_1_20170929105140138

队列 :队列是一种先进先出的数据结构。

比如说

排队买票,

有一个售票口,最多能排30人,那么最大存储空间就是30人,

每当有1个新人过来排队,就会站在队尾,这就叫入队,

每当有1个人买到票了,就会离开,就叫出队。

生活中,最前面1个人买完票后,队伍中剩下的每1个人都会向前走1位,

对于计算机来说,每个人动一下意味着要执行更多的代码,

如果卖票的人卖完第1个 ,第一个人就离开,

售票员就走向第2个,再走向第3个,

直到1队队伍尾走完,再进1队。售票员就重头开始走就会更方便。

========================================================

环形队列是这样的,不用每个人都向前移动1位,

在一个排满的队列中,当售票员卖了第1张票时,不要每个人向前移动。

因为1号位空出来了,下一个排队的人就站在1号位置上,队尾+1变成2,

售票员向前走了一步,再卖1张,

2号位置空出来了,下一个排队的人就到2号位置上,

队尾+1变成3,依次类推,

售票员卖到队伍尾部后又会重头开始来,依旧是按照1 2 3 的顺序,

就不需要执行更多的代码。

环形队列需要考虑以下内容:

1. 创建队列

(最大存储量,队列长度,队头下标,队尾下标,数组记录队伍每个下标的内容)

2. 删除队列,不需要的时候从内存中清除。

3. 队列为空判断,不能出队操作了。

4. 队列为满判断,不能入队操作了。

5. 遍历队列元素,验证队列内容是否按照要求来。

取余数就是为了,队伍再次从头开始排队。

代码就按照以上的需求进行建立

#define MAXSIZE 5

#include

// 队列包含的信息

typedef struct queue

{

int *qu; //用来存储全部的队列中的元素

int head; //队列头

int tail; //队尾

int qlength; //队列长度

int maxsize; //用来记录队列的最大容量

}QUEUE;

// 初始化队列

QUEUE *CreateQueue ( int maxsize)

{

printf("[%lu]",sizeof(QUEUE));

QUEUE *q= (QUEUE *)malloc(sizeof(QUEUE));

if (q == NULL) {

printf("Memory alloc failure\n");

exit(-1);

}

q->qu=(int *)malloc(sizeof(int)*maxsize);

if(NULL==q->qu)

{

printf("Memory allocation failure");

exit(-1); //退出程序

}

//分配完空间后,1开始队头队尾都在一起,因为没人,都为0长度也为0,

q->head = 0;

q->tail = 0;

q->qlength = 0;

q->maxsize = maxsize;

return q;

}

// 判断空队列,长度为0则为空

bool Empty (QUEUE *q)

{

return q->qlength == 0 ? true : false;

}

// 判断满队列,长度=最大容量为满

bool Full (QUEUE *q)

{

return q->qlength == q->maxsize ? true : false;

}

//入队

bool Enqueue (QUEUE *q , int num)

{

// 队列不满才插入

if (Full(q)) {

printf("队列满了,插入失败\n");

return false;

}else{

//给队伍最尾添加赋值。

q->qu[q->tail] = num;

//队尾向后移动一位,如果超过最大值,则从0开始,变成队尾

q->tail = (q->tail +1)%q->maxsize;

//队伍长度+1

q->qlength ++;

return true;

}

}

// 出队

bool Dequeue (QUEUE *q)

{

// 队列有元素才能够删除

if (Empty(q)) {

printf("队列为空,删除失败\n");

return false;

}else{

//队头向后移动一位 超过最大值又重新 从0 开始计算

q->head = (q->head +1)%q->maxsize;

// 队伍长度-1

q->qlength -- ;

return true;

}

}

// 遍历队列元素

void Traverse(QUEUE *q)

{

// 在队列长度范围内 打印队列从队列头 到队列尾的元素

for (int i=0 ; iqlength; i++) {

printf("%d ", q->qu[(q->head+i)%q->maxsize]);

}

printf("\n");

}

int main(int argc, const char * argv[]) {

// insert code here...

std::cout << "Hello, World!\n";

QUEUE Q =*CreateQueue(MAXSIZE);

if ( Empty(&Q)) {

printf("空队列\n");

};

Enqueue(&Q, 10);

Enqueue(&Q, 12);

Enqueue(&Q, 14);

if ( Empty(&Q)) {

printf("空队列\n");

};

Enqueue(&Q, 16);

Enqueue(&Q, 18);

Dequeue(&Q);

Enqueue(&Q, 20);

if (Full(&Q)) {

printf("满队列\n");

}

Traverse(&Q);

return 0;

}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

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

运行结果

Hello, World!

[24]空队列

满队列

12 14 16 18 20

Program ended with exit code: 01

2

3

4

5

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值