1 /**************************************************************************************
2 * Function : 模拟队列
3 * Create Date : 2014/04/23
4 * Author : NTSK13
5 * Email : [email protected]
6 * Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性。
7 * 任何单位和个人不经本人允许不得用于商业用途
8 * Version : V0.1
9 ***************************************************************************************
10 题目:简单数据结构之队列模拟
11
12 **************************************************************************************/
13 #include<stdio.h>
14
15 #define MY_FUNC 1
16 #if MY_FUNC
17
18 #define M 10 //队列最大长度
19
20 typedef struct queue
21 {
22 int data[M];
23 int len;//队列当前长度
24 }Queue;
25
26 int sample[M];
27 int result[M];
28
29 void init_queue(Queue *a);//队列初始化
30 int in_queue(Queue *a,int value);//进队
31 int out_queue(Queue *a);//出队
32 int get_head_element(Queue *a);//获取队首的元素
33
34 // The first method:
35 int main()
36 {
37 int i=0;
38 Queue sq;
39 init_queue(&sq);
40
41 freopen("input.txt","r",stdin);
42
43 for(i=0;i<M;i++)
44 scanf("%d",&sample[i]); // get input data
45 out_queue(&sq);
46 get_head_element(&sq);
47
48 for(i=0;i<M;i++)
49 in_queue(&sq,sample[i]);
50 in_queue(&sq,100);
51
52 for(i=0;i<M;i++)
53 result[i]=out_queue(&sq);
54
55 for(i=0;i<M;i++)
56 {
57 printf("%d\t",result[i]);
58 fflush(stdout);//修复Eclipse printf()不能显示的小bug
59 }
60
61 printf("\n");
62 fflush(stdout);
63
64 return (0);
65 }
66
67 void init_queue(Queue *a)//队列初始化
68 {
69 (*a).len=0;
70 }
71 //该种情况,进队效率太低
72 int in_queue(Queue *a,int value)//进队
73 {
74 int i=0;
75 if( (*a).len==M)
76 {
77 printf("Queue is full ,can not in !!!\n");
78 fflush(stdout);
79 return (-1);
80 }else{
81 if((*a).len==0)
82 {
83 (*a).data[0]=value;
84 (*a).len++;
85 return (1);
86 }else
87 {
88 for(i=(*a).len;i>0;i--)
89 {
90 (*a).data[i]=(*a).data[i-1];
91 }
92 (*a).data[0]=value;
93 (*a).len++;
94 return (1);
95 }
96 }
97 }
98 int out_queue(Queue *a)
99 {
100 int tmp=0;
101 if((*a).len==0)
102 {
103 printf("Queue is empty ,can not out !!!\n");
104 fflush(stdout);
105 return (-1);
106 }else{
107 tmp=(*a).len-1;
108 (*a).len--;
109 return ( (*a).data[tmp]);
110 }
111 }
112 int get_head_element(Queue *a)
113 {
114 if( (*a).len==0)
115 {
116 printf("Queue is empty full ,can not get !!!\n");
117 fflush(stdout);
118 return (-1);
119 }else{
120 return ( (*a).data[ (*a).len -1]);
121 }
122 }
123
124 /********************************************my function end**************************************************/
125 #else
126
127
128 #define M 10 //队列最大长度
129
130 typedef struct queue
131 {
132 int data[2*M-1];//队列最长为M
133 int head;
134 int tail;
135 int len;//队列当前长度
136 }Queue;
137
138 int sample[M];
139 int result[M];
140
141 void init_queue(Queue *a);//队列初始化
142 int in_queue(Queue *a,int value);//进队
143 int out_queue(Queue *a);//出队
144 int get_head_element(Queue *a);//获取队首的元素
145
146 // The second method:
147 int main()
148 {
149 int i=0;
150 Queue sq;
151 init_queue(&sq);
152
153 freopen("input.txt","r",stdin);
154
155 for(i=0;i<M;i++)
156 scanf("%d",&sample[i]); // get input data
157 out_queue(&sq);
158 get_head_element(&sq);
159
160 for(i=0;i<M;i++)
161 in_queue(&sq,sample[i]);
162 in_queue(&sq,100);
163
164 for(i=0;i<M;i++)
165 result[i]=out_queue(&sq);
166
167 for(i=0;i<M;i++)
168 {
169 printf("%d\t",result[i]);
170 fflush(stdout);//修复Eclipse printf()不能显示的小bug
171 }
172
173 printf("\n");
174 fflush(stdout);
175
176 return (0);
177 }
178
179
180 void init_queue(Queue *a)
181 {
182 (*a).len=0;
183 }
184
185 //这种方法 避免了 for 循环
186 int in_queue(Queue *a,int value)//进队
187 {
188 if( (*a).len==M)
189 {
190 printf("Queue is full ,can not in !!!\n");
191 fflush(stdout);
192 return (-1);
193 }else{
194 if((*a).len==0)
195 {
196 (*a).data[M]=value;
197 (*a).len++;
198 (*a).head=M;
199 (*a).tail=M;
200 return (1);
201 }else
202 {
203 if( (*a).tail ==0 )
204 (*a).tail=2*M-2;
205 else
206 (*a).tail--;
207
208 (*a).data[ (*a).tail]=value;
209 (*a).len++;
210 return (1);
211 }
212 }
213 }
214 int out_queue(Queue *a)
215 {
216 int tmp=0;
217 if((*a).len==0)
218 {
219 printf("Queue is empty ,can not out !!!\n");
220 fflush(stdout);
221 return (-1);
222 }else{
223 tmp=(*a).head;
224 if((*a).head==0)
225 (*a).head=2*M-2;
226 else
227 (*a).head--;
228 (*a).len--;
229 return ( (*a).data[tmp]);
230 }
231 }
232 int get_head_element(Queue *a)
233 {
234 if( (*a).len==0)
235 {
236 printf("Queue is empty full ,can not get !!!\n");
237 fflush(stdout);
238 return (-1);
239 }else{
240 return ( (*a).data[ (*a).head ]);
241 }
242 }
243
244 #endif
简单数据结构之队列模拟,码迷,mamicode.com
时间: 2024-10-18 06:00:43