栈(stack)大家一定不陌生,限定仅在表尾进行插入和删除操作的线性表。
理解栈,首先要理解栈是线性表的特例,只是操作受限制了;栈的顺序存储结构也是线性表顺序存储的简化,对于栈这一种只能一头插入删除的线性表来说,我们可以用数组实现它,但是数组的大小是给定的,如果你想存储的元素个数多于数组的个数,这时候自然而然就想到了动态开辟堆空间,手动申请手动释放……
自己写了一点函数实……不对的地方望大神给予改正
1栈的定义
2 3 typedef struct _stack 4 { 5 int top; 6 elemtype *data; 7 int len; 8 }stack;
//初始化
1 stack *init_seq_stack(int e) 2 { 3 stack *s = (stack *)malloc(sizeof(stack) * 1); 4 if(s == NULL) 5 { 6 return NULL; 7 } 8 s->data = (elemtype *)malloc(sizeof(elemtype) * e); 9 if (s->data == NULL) 10 { 11 return false; 12 } 13 s->top = 0; 14 s->len = e; 15 return s; 16 17 }
1 static bool alloc(stack *p) 2 { 3 if(p == NULL) 4 { 5 return false; 6 } 7 printf("%d-%d\n",p->len ,p->len * 2); 8 p->data = (elemtype *)realloc(p->data, p->len * 2 * sizeof(elemtype));//1024-int 9 p->len = 2*p->len; 10 11 return true; 12 13 }
1 bool destory(stack *s) 2 { 3 if(s == NULL) 4 { 5 return false; 6 } 7 free(s->data); 8 free(s); 9 return true; 10 } 11 12 13 14 bool clear_seqstack(stack *s) 15 { 16 if(s == NULL) 17 { 18 return false; 19 } 20 s->top = 0; 21 return true; 22 } 23 24 bool push(stack *s,elemtype e) 25 { 26 if(s == NULL) 27 { 28 return false; 29 } 30 if( is_full(s)) 31 { 32 alloc(s); 33 } 34 35 s->data[s->top ++] = e ; 36 return true; 37 38 } 39 40 41 bool pop(stack *s,elemtype *e) 42 { 43 if(s == NULL) 44 { 45 return false; 46 } 47 if(is_empty(s)) 48 { 49 return false; 50 } 51 52 *e = s->data[--s->top]; 53 return true; 54 } 55 56 57 bool is_empty(stack *s) 58 { 59 if(s == NULL) 60 { 61 return false; 62 } 63 return s->top == 0; 64 } 65 66 bool is_full(stack *s) 67 { 68 if(s == NULL) 69 { 70 return false; 71 } 72 return s->top == s->len; 73 } 74 75 int get_length(stack *s) 76 { 77 if(s == NULL) 78 { 79 return false; 80 } 81 return s->top; 82 } 83 84 85 elemtype get_top(stack *s,elemtype e) 86 { 87 if(s == NULL) 88 { 89 return false; 90 } 91 e = s->data[s->top-1]; 92 return e; 93 94 } 95 96 97 bool show(stack *s) 98 { 99 if(s == NULL) 100 { 101 return false; 102 } 103 for(int i = s->top-1 ;i>=0;i--) 104 { 105 printf("%d ",s->data[i]); 106 } 107 printf("\n"); 108 return true; 109 } 110 111 bool set_top(stack *s,elemtype e) 112 { 113 if(s == NULL) 114 { 115 return true; 116 } 117 118 s->data [-- s->top] = e; 119 return true ; 120 }