学习的捷径:多写代码
栈:栈是限制在一端进行插入操作和删除操作的线性表,额,又是线性表,那就是说又可以有两种存储方式:顺序栈,链式栈。允许进行操作的一端称为“栈顶”,另一端称为“栈底”。特点:先进先出。
所谓的栈和队列,其实是一种技术,有时候需要特殊的存储方式,然后在必要的时候还原该元素,就会利用到栈或者队列,例如在ARM操作的一些裸机代码中,需要保持状态寄存器中的值,根据需要可以利用栈或者队列来存储,用起来很方便安全,所以在涉及到存储数据之类的操作时候,要想到这两个技术。
基本运算:
创建空栈:createstack();判断是否空栈 isempty(S);判断满栈isfull(S);进栈:push(S,x);出栈pop(S);
同样,再一次熟悉一下顺序存储和链式存储
顺序栈:
#include <stdio.h> #include <stdlib.h> #include <strings.h> #include <errno.h> #define N 10 typedef int datatype; typedef struct { datatype data[N]; int top; }sqstack; sqstack * create() { sqstack * s; bzero(&s,sizeof(s)); if((s = (sqstack *)malloc(sizeof(sqstack)))==NULL) { perror("malloc"); exit(-1); } s->top = -1; return s; } int isempty(sqstack *s) { if(s->top == -1) return 0; return -1; } int isfull(sqstack *s) { if(s->top == N-1) return 0; return -1; } int push(sqstack *s,datatype data) { if(isfull(s)==0) { printf("stack is full\n"); return -1; } s->top++; s->data[s->top] = data; return 0; } datatype pop(sqstack *s) { datatype data; if(isempty(s)==0) { printf("the sqstack is empty!"); return ; } data = s->data[s->top]; s->top--; return data; } void show(sqstack *s) { int i; i = s->top; if(isempty(s)==0) { printf("empty!"); return ; } printf("data = %d\n",s->data[i]); } int main(int argc,char * argv[]) { int i,ret; sqstack * s; s = create(); for(i = 1;i< 12;i++) { ret = push(s,i); if(ret != 0 ) return -1; show(s); } free(s); return 0; }
链式栈:
#include <stdio.h> #include <stdlib.h> typedef int datatype; typedef struct node{ datatype data; struct node * next; }linknode,*linkstack; linkstack create() { linkstack h; if((h = (linkstack)malloc(sizeof(linknode)))==NULL) { perror("malloc"); return NULL; } h->next = NULL; return h; } int push(linkstack h,datatype data) { linkstack p; if((p = (linkstack)malloc(sizeof(linknode)))==NULL) { perror("malloc"); return -1; } p->data = data; p->next = h->next; h->next = p; return 0; } int isempty(linkstack h) { if(h->next==NULL) { printf("is empty\n"); return 1; } return 0; } datatype pop(linkstack h) { datatype data; linkstack p = NULL; if(isempty(h)) { return 0; } p = h->next; h->next = p->next; data = p->data; free(p); return data; } void show(linkstack h) { linkstack p = NULL; if(isempty(h)) { printf("is empty!\n"); return ; } p = h->next; while(p != NULL) { printf("data = %d\n",p->data); p = p->next; } } int main(int argc,char * argv[]) { int i; linkstack h; h = create(); for(i = 1;i < 10;i++) { push(h,i); } show(h); return 0; }
比较简单的操作。接下来就是队列了,一般用的循环队列。一个有趣的程序叫做球钟。
下次实现。