算法导论10:栈链表的简化、队列的数组实现 2016.1.10
把昨天提到的S.bottom简化之后又改了栈的链表。代码如下(已折叠):
#include<stdio.h> #include<stdlib.h> typedef struct _node{ int num; struct _node *next; }node; node *s; void build(node *&S) { s=(node *)malloc(sizeof(node)); s->next=NULL; } int sempty(node *&S) { if (s->next==NULL) return 1; else return 0; } int pop(node *&S) { if (sempty(S)) { printf("栈为空!\n"); } else { node *p; p=s; s=s->next; int k=p->num; free(p); return k; } } void init(node *&S) { while (!sempty(S)) { pop(S); } } void push(node *&S,int n) { node *p; p=(node *)malloc(sizeof(node)); p->num=n; p->next=s; s=p; } void showstack(node * S) { while (S->next!=NULL){ int k=S->num; S=S->next; printf("|%d|\n",k); } printf("| |\n"); printf(" - \n"); } int main() { build(s); int n; 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); push(s,n); break; case 3:pop(s); break; case 4:return 0; } showstack(s); } return 0; }
下面是队列的数组实现,队列跟栈的区别,队列是先进先出,栈是先进后出。由于规则相似,稍微修改了一下栈的数组实现就行了。不过队列还需要有一个取模的优化,只好等到假期再写了,下面的是一般队列的代码:
#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=0; } int sempty(struct _queue &S) { if (S.head==S.tail) return 1; else return 0; } void enqueue(struct _queue &S,int n) { if (S.tail==MAXTOP) { printf("队列溢出!\n"); } else { S.num[S.tail]=n; S.tail++; } } int dequeue(struct _queue &S) { if (S.head==S.tail) { printf("空队列!\n"); } else { return S.num[S.head++]; } } void showqueue(struct _queue S) { while (!sempty(S)){ int k=dequeue(S); printf("|%d|\n",k); } printf("| |\n"); } int main() { int n; 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; }