算法导论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("队列溢出!\n"); } else { S.num[S.tail]=n; S.tail=(S.tail+1)%(MAXTOP+1); } } int dequeue(struct _queue &S) { if (sempty(S)) { printf("空队列!\n"); } 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|\n",k); } printf("| |\n"); } int main() { int n; init(s); while (1) { printf("1:初始化队列;2:入队列;3:出队列;4:退出。\n"); 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; }