2019-03-31 11:00:21 +00:00
---
title: キューの実装
author: kazu634
date: 2008-05-20
wordtwit_post_info:
- 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4027;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}'
categories:
- C
- Programming
---
< div class = "section" >
< p >
『< a href = "http://d.hatena.ne.jp/asin/4797331631" onclick = "__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/asin/4797331631', '新版 C言語によるアルゴリズムとデータ構造');" > 新版 C言語によるアルゴリズムとデータ構造< / a > 』から。
< / p >
< pre class = "syntax-highlight" >
< span class = "synPreProc" > #include < / span > < span class = "synConstant" > < stdio.h> < / span >
< span class = "synPreProc" > #include < / span > < span class = "synConstant" > < stdlib.h> < / span >
< span class = "synType" > typedef< / span > < span class = "synType" > struct< / span >
{
< span class = "synType" > int< / span > max; < span class = "synComment" > /* the size of the queue */< / span >
< span class = "synType" > int< / span > num; < span class = "synComment" > /* Current Number of the elements */< / span >
< span class = "synType" > int< / span > front; < span class = "synComment" > /* the front cursor */< / span >
< span class = "synType" > int< / span > rear; < span class = "synComment" > /* the rear cursor */< / span >
< span class = "synType" > int</ span > *que; <span class="synComment">/* the pointer to the first element */</ span >
} Queue;
< span class = "synComment" > /* initialization of the que */< / span >
< span class = "synType" > int< / span > QueueAlloc(Queue *q, < span class = "synType" > int< / span > max)
{
q-> num = q-> front = q-> rear = < span class = "synConstant" > < / span > ;
< span class = "synStatement" > if< / span > ((q-> que = calloc(max, < span class = "synStatement" > sizeof< / span > (< span class = "synType" > int< / span > ))) == < span class = "synConstant" > NULL< / span > ) {
q-> max = < span class = "synConstant" > < / span > ;
< span class = "synStatement" > return< / span > (-< span class = "synConstant" > 1< / span > );
}
q-> max = max;
< span class = "synStatement" > return< / span > (< span class = "synConstant" > < / span > );
}
< span class = "synComment" > /* Clear the queue */< / span >
< span class = "synType" > void< / span > QueueFree(Queue *q)
{
< span class = "synStatement" > if< / span > (q-> que != < span class = "synConstant" > NULL< / span > ) {
free(q-> que);
q-> max = q-> num = q-> front = q-> rear = < span class = "synConstant" > < / span > ;
}
}
< span class = "synComment" > /* Enque the data into the queue */< / span >
< span class = "synType" > int< / span > QueueEnque(Queue *q, < span class = "synType" > int< / span > x)
{
< span class = "synStatement" > if< / span > (q-> num > = q-> max) < span class = "synStatement" > return< / span > (-< span class = "synConstant" > 1< / span > );
< span class = "synStatement" > else< / span > {
q-> num++;
q-> que[q-> rear++] = x;
< span class = "synStatement" > if< / span > (q-> rear == q-> max) q-> rear = < span class = "synConstant" > < / span > ;
< span class = "synStatement" > return< / span > (< span class = "synConstant" > < / span > );
}
}
< span class = "synComment" > /* Deque the data from the queue */< / span >
< span class = "synType" > int< / span > QueueDeque(Queue *q, < span class = "synType" > int< / span > *x)
{
< span class = "synStatement" > if< / span > (q-> num < = < span class = "synConstant" > < / span > ) < span class = "synStatement" > return< / span > (-< span class = "synConstant" > 1< / span > );
< span class = "synStatement" > else< / span > {
q-> num--;
*x = q-> que[q-> front++];
< span class = "synStatement" > if< / span > (q-> front == q-> max) q-> front = < span class = "synConstant" > < / span > ;
< span class = "synStatement" > return< / span > (< span class = "synConstant" > < / span > );
}
}
< span class = "synComment" > /* the size of the que */< / span >
< span class = "synType" > int< / span > QueueSize(< span class = "synType" > const< / span > Queue *q)
{
< span class = "synStatement" > return< / span > (q-> max);
}
< span class = "synComment" > /* the number of the data stored in the queue */< / span >
< span class = "synType" > int< / span > QueueNo(< span class = "synType" > const< / span > Queue *q)
{
< span class = "synStatement" > return< / span > (q-> num);
}
< span class = "synComment" > /* Is the queue empty? */< / span >
< span class = "synType" > int< / span > QueueIsEmpty(< span class = "synType" > const< / span > Queue *q)
{
< span class = "synStatement" > return< / span > (q-> num < = < span class = "synConstant" > < / span > );
}
< span class = "synComment" > /* Is the queue full? */< / span >
< span class = "synType" > int< / span > QueueIsFull(< span class = "synType" > const< / span > Queue *q)
{
< span class = "synStatement" > return< / span > (q-> num > = q-> max);
}
< span class = "synType" > int< / span > main(< span class = "synType" > void< / span > )
{
Queue que;
< span class = "synStatement" > if< / span > (QueueAlloc(& que, < span class = "synConstant" > 100< / span > ) == -< span class = "synConstant" > 1< / span > ) {
puts(< span class = "synConstant" > " Fail to secure the memory of the queue." < / span > );
< span class = "synStatement" > return< / span > (< span class = "synConstant" > 1< / span > );
}
< span class = "synStatement" > while< / span > (< span class = "synConstant" > 1< / span > ) {
< span class = "synType" > int< / span > m, x;
printf (< span class = "synConstant" > " Current Number of the Data: </ span >< span class = "synSpecial" > %d</ span >< span class = "synConstant" > / </ span >< span class = "synSpecial" > %d\n</ span >< span class = "synConstant" > " </ span > , QueueNo(& que), QueueSize(& que));
printf (< span class = "synConstant" > " (1) Enque (2) Deque 0) Exit" < / span > );
scanf(< span class = "synConstant" > " < / span > < span class = "synSpecial" > %d< / span > < span class = "synConstant" > " < / span > , & m);
< span class = "synStatement" > if< / span > (m == < span class = "synConstant" > < / span > ) < span class = "synStatement" > break< / span > ;
< span class = "synStatement" > switch< / span > (m) {
< span class = "synStatement" > case< / span > < span class = "synConstant" > 1< / span > :
printf (< span class = "synConstant" > " Data: " < / span > );
scanf(< span class = "synConstant" > " < / span > < span class = "synSpecial" > %d< / span > < span class = "synConstant" > " < / span > , & x);
< span class = "synStatement" > if< / span > (QueueEnque(& que, x) == -< span class = "synConstant" > 1< / span > ) puts(< span class = "synConstant" > " Fail to enque the data into the que" < / span > );
< span class = "synStatement" > break< / span > ;
< span class = "synStatement" > case< / span > < span class = "synConstant" > 2< / span > :
< span class = "synStatement" > if< / span > (QueueDeque(& que, & x) == -< span class = "synConstant" > 1< / span > ) puts(< span class = "synConstant" > " Cannot Deque!" < / span > );
< span class = "synStatement" > else</ span > printf (< span class = "synConstant" > " The Decued Data: </ span >< span class = "synSpecial" > %d\n</ span >< span class = "synConstant" > " </ span > , x);
< span class = "synStatement" > break< / span > ;
}
}
QueueFree(& que);
< span class = "synStatement" > return< / span > (< span class = "synConstant" > < / span > );
}
< / pre >
2019-04-02 16:06:15 +00:00
< / div >