<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>simple idea &#187; queue</title>
	<atom:link href="http://www.k14a.net/archives/tag/queue/feed" rel="self" type="application/rss+xml" />
	<link>http://www.k14a.net</link>
	<description>simple is beautiful</description>
	<lastBuildDate>Tue, 10 Aug 2010 08:55:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>キュー&amp;スタック</title>
		<link>http://www.k14a.net/archives/26</link>
		<comments>http://www.k14a.net/archives/26#comments</comments>
		<pubDate>Wed, 25 Mar 2009 12:42:09 +0000</pubDate>
		<dc:creator>moriken</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Program]]></category>
		<category><![CDATA[queue]]></category>
		<category><![CDATA[stack]]></category>

		<guid isPermaLink="false">http://www.k14a.net/?p=26</guid>
		<description><![CDATA[

会社でのC言語研修の問題として、定番だけどキュー&#38;スタックを考えた。
キューとスタックはよく似ていて、違うのはデータの取出す順序が先に入れたものから取出す(キュー)のか、後から入れたものから取出す(スタック) [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwww.k14a.net%252Farchives%252F26%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22%E3%82%AD%E3%83%A5%E3%83%BC%26%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%22%20%7D);"></div>
<p>会社でのC言語研修の問題として、定番だけどキュー&amp;スタックを考えた。<br />
キューとスタックはよく似ていて、違うのはデータの取出す順序が先に入れたものから取出す(キュー)のか、後から入れたものから取出す(スタック)ぐらい。<br />
そこで、キューとスタックをまとめてあつかえるプログラムを作ってみた。きちんとエラー処理はしていないので、もし使うのであれば、その辺はきちんと作る必要がある。</p>
<p>《que.h》</p>
<pre class="brush: c; ">

#ifndef _QUE_H_
#define _QUE_H_

#include        &lt;stdio.h&gt;
#include        &lt;stdlib.h&gt;
#include        &lt;string.h&gt;

#define         GET_QUE         1
#define         GET_STACK       0

/* structuers   */
typedef struct que {
struct  que     *prev;
struct  que     *next;
        void    *data;
} QUE;

/* function prototype   */
int     que_init();
int     que_enque(void *data);
int     que_deque_first(void **data);
int     que_deque_last(void **data);

#endif  /* _QUE_H_      */
</pre>
<p>《que.c》</p>
<pre class="brush: c; ">

#include        &quot;que.h&quot;

static  QUE     root;

static  int     que_deque(void **data, int get_type);

int     que_init()
{
        memset (&amp;root, 0, sizeof(root));
        root.prev = &amp;root;
        root.next = &amp;root;

        return(0);
}

int     que_enque(void *data)
{
        QUE     *p      = NULL;
        QUE     *last   = NULL;

        p = (QUE *) malloc (sizeof(QUE));

        if (root.next == &amp;root || root.prev == &amp;root) {
                root.next = p;
                root.prev = p;
                p-&gt;prev = &amp;root;
        } else {
                last = root.prev;
                last-&gt;next = p;
                root.prev = p;
                p-&gt;prev = last;
        }

        p-&gt;next = &amp;root;
        p-&gt;data = data;

        return(0);
}

int     que_deque_first(void **data)
{
        int     status;

        if (root.next == &amp;root) {
                return(1);
        }

        status = que_deque(data, GET_QUE);

        return(status);
}

int     que_deque_last(void **data)
{
        int     status;

        if (root.prev == &amp;root) {
                return(1);
        }

        status = que_deque(data, GET_STACK);

        return(status);
}

static  int     que_deque(void **data, int get_type)
{
        QUE     *p      = NULL;

        if (get_type) {
                p = root.next;
                p-&gt;next-&gt;prev = p-&gt;prev;
                root.next = p-&gt;next;
        } else {
                p = root.prev;
                p-&gt;prev-&gt;next = p-&gt;next;
                root.prev = p-&gt;prev;
        }

        *data = p-&gt;data;
        free(p);

        return(0);
}
</pre>
<p>que_deque()内で、キューまたはスタックの切替えを行っている。使用する場合は、ラッパーであるque_deque_first()、que_deque_last()でキューまたはスタックを選択する。</p>

]]></content:encoded>
			<wfw:commentRss>http://www.k14a.net/archives/26/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
