算法导论11:优化后的数组实现的队列 2016.1.11

  本来想假期再继续,结果发现写博客已经成了总结自己的一种习惯,所以还是继续写吧。

  其实有一部分原因是今天英语考砸了。。哈哈,不管那些了,看来以后学习方式得改变一下,不能太功利,从简单开始,一点一点做好。

  今天是队列的数组优化。昨天的队列有一个致命弱点,就是能盛放的数据数量越来越少,至于原因可以自己思考也可以上网搜索。如果是链表实现的话因为是动态分配空间,就完全不会有这个问题。

  优化就是用了取模运算,实现数组空间的循环运用。

下面是代码:

#include<stdio.h>

#define MAXTOP 10 

struct _queue {
    int head,tail;
    int num[MAXTOP+1];
}s;

void init(struct _queue &S)
{
    S.head=0;
    S.tail=1;
}

int sempty(struct _queue &S)
{
    if ((S.head+1)%(MAXTOP+1)==S.tail) return 1;
    else return 0;
}

void enqueue(struct _queue &S,int n)
{
    if ((S.tail+1)%(MAXTOP+1)==S.head) {
        printf("队列溢出!
");
    }
    else {
        S.num[S.tail]=n;
        S.tail=(S.tail+1)%(MAXTOP+1);
    }
}

int dequeue(struct _queue &S)
{
    if (sempty(S)) {
        printf("空队列!
");
    }
    else {
        S.head=(S.head+1)%(MAXTOP+1);
        int k=S.num[S.head];
        return k;
    }
}

void showqueue(struct _queue S)
{
    while (!sempty(S)){
        int k=dequeue(S);
        printf("|%d|
",k);
    }
    printf("| |
");
}

int main()
{
    int n;
    init(s);
    while (1) {
        printf("1:初始化队列;2:入队列;3:出队列;4:退出。
");
        int k;
        scanf("%d",&k);
        switch(k) {
            case 1:init(s); break;
            case 2:scanf("%d",&n); enqueue(s,n); break;
            case 3:dequeue(s); break;
            case 4:return 0;
        }
        showqueue(s);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/itlqs/p/5122600.html