栈和队列都是最基础的数据结构,栈的思想是“先进后出”,队列的思想是“先进先出”。怎么说呢,栈和队列其实都是对于单链表或者数组的一些特殊操作。在后边很多算法中经常用到(比如BFS, SPFA。。。)
栈主要操作有:
入栈Push;
取栈顶Get_Top;
出栈(删除栈顶元素)Pop;
栈的数组实现(代码非常简单,关键是思想):
//数组实现 #include <stdio.h> #include <malloc.h> #define maxsize 10 typedef struct { int data[maxsize]; int top; int base; }seqstack; seqstack * s; void initstack(seqstack * s) { s->top = 0; s->base = 0; } int empty(seqstack * s) { if(s->top == s->base) return 1; else return 0; } void push(seqstack * s, int x) { if(s->top >= maxsize-1) { printf("ERROR!\n"); } else { s->data[s->top] = x; s->top++; } } void pop(seqstack * s) { if(empty(s)) { printf("ERROR!\n"); } else { s->top--; printf("%d\n",s->data[s->top]); } } int main() { seqstack * s; s = (seqstack *)malloc(sizeof(seqstack)); initstack(s); push(s,1); push(s,3); pop(s); push(s,2); pop(s); pop(s); pop(s); return 0; }
单链表实现:
//链式 #include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef struct node { int data; struct node *next; }node,linkstack; void InitStack(linkstack * top) { top->next = NULL; } int IsEmpty(linkstack * top) { if(top->next == NULL) return 1; return 0; } int Push(linkstack * top, int x) { node * p; p = (node *)malloc(sizeof(node)); if(p == NULL) return 0; p->data = x; p->next = top->next; top->next = p; return 1; } int Pop(linkstack * top, int *x) { node * p; if(IsEmpty(top)) { printf("ERROE!\n"); return 0; } p = top->next; *x = p->data; top->next = p->next; free(p); return 1; } int main() { int x; linkstack * s; s = (linkstack *)malloc(sizeof(linkstack)); InitStack(s); Push(s,1); Push(s,3); Pop(s,&x); printf("%d\n",x); Push(s,2); Pop(s,&x); printf("%d\n",x); Pop(s,&x); printf("%d\n",x); Pop(s,&x); return 0; }
队列的操作与栈类似,这里不赘述了,且看代码实现:
//数组实现 #include <stdio.h> #include <malloc.h> #define maxsize 66 typedef struct { int data[maxsize]; int front,rear; }sequeue; sequeue * q; void initqueue(sequeue *q) { q->front = -1; q->rear = -1; } int del(sequeue *q) { if(q->front == q->rear) return NULL; else { q->front++; return q->data[q->front]; } } int insertqueue(sequeue *q,int x) { if(q->rear >= maxsize-1) return NULL; else { (q->rear)++; q->data[q->rear] = x; return 1; } } int empty(sequeue * q) { if(q->front == q->rear) return 0; else return 1; } void print(sequeue * q) { if(q->front == q->rear) printf("ERROR!\n"); else { while(empty(q)) { q->front++; printf("%d\n",q->data[q->front]); } } } int main() { int i; sequeue * q; q = (sequeue *)malloc(sizeof(sequeue)); initqueue(q); for(i = 0; i < 6; i++) insertqueue(q,i); printf("front is %d\n\n",del(q)); printf("Then the last data is:\n"); print(q); return 0; } //链表实现 #include <stdio.h> #include <malloc.h> typedef struct node { int data; struct node * next; }linklist; typedef struct { linklist * front, * rear; }linkqueue; linkqueue * q; //建立队列 void initqueue(linkqueue * q) { q->front = (linkqueue *)malloc(sizeof(linklist)); q->front->next = NULL; q->rear = q->front; } //判断队列空否 int empty(linkqueue * q) { if(q->front == q->rear) return 1; else return 0; } //入队列 void inqueue(linkqueue * q, int x) { q->rear->next = (linklist *)malloc(sizeof(linklist)); q->rear->next->data = x; q->rear = q->rear->next; q->rear->next = NULL; } //出队列 int outqueue(linkqueue * q) { linklist * s; if(empty(q)) return NULL; else { s = q->front->next; printf("%d\n",s->data); if(s == q->rear) q->front = q->rear; else q->front->next = s->next; free(s); return 1; } } //main int main() { int i; linkqueue * l; l = (linkqueue *)malloc(sizeof(linkqueue)); initqueue(l); for(i = 0; i < 10; i++) inqueue(l,i); for(i = 0; i < 10; i++) outqueue(l); return 0; }