- 论坛徽章:
- 1
|
本帖最后由 vbs100 于 2010-02-07 22:32 编辑
- $ cat stack1.c
- #include <stdio.h>
- #include <stdlib.h>
- #define STACK_INIT_SIZE 5
- #define STACKINCREMENT 5
- typedef struct {
- void **base;
- void **top;
- int stacksize;
- } stack_t;
- void InitStack(stack_t *s){
- s->base = malloc(STACK_INIT_SIZE * sizeof(void *));
- if(!s->base) abort();
- s->top = s->base;
- s->stacksize = STACK_INIT_SIZE;
- }
- void Peak(stack_t *s, void **p){
- if(s->base == s->top)
- *p = NULL;
- else
- *p = *(s->top - 1);
- }
- void Push(stack_t *s, void *p){
- if(s->top - s->base >= s->stacksize){
- s->base = realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(void *));
- if(!s->base) abort();
- s->top = s->base + s->stacksize;
- s->stacksize += STACKINCREMENT;
- }
- *s->top++ = p;
- }
- void Pop(stack_t *s, void **p){
- if(s->base == s->top)
- *p = NULL;
- else
- *p = *--s->top;
- }
- typedef struct {
- char name[16];
- int value;
- }data_t;
- int main()
- {
- int i;
- stack_t S;
- data_t *d1, *d2;
- InitStack(&S);
- for(i = 0; i < 20; i++)
- {
- d1 = malloc(sizeof(data_t));
- sprintf(d1->name,"%d * %d = ", i, i);
- d1->value = i * i;
- Push(&S, d1);
- }
- Peak(&S, (void **)&d2);
- if(d2) printf("%s%d\n", d2->name, d2->value);
- for(i = 0; i < 30; i++)
- {
- Pop(&S, (void **)&d2);
- if(!d2) break;
- printf("%s%d\n", d2->name, d2->value);
- free(d2);
- }
- }
复制代码- $ cat stack2.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/queue.h>
- typedef struct {
- char name[16];
- int value;
- }data_t;
- SLIST_HEAD(stack, node);
- struct node {
- data_t data;
- SLIST_ENTRY(node) p;
- };
- int main()
- {
- int i;
- struct stack S;
- struct node *n1, *n2;
- SLIST_INIT(&S);
- for(i = 0; i < 20; i++)
- {
- n1 = malloc(sizeof(struct node));
- sprintf(n1->data.name,"%d * %d = ", i, i);
- n1->data.value = i * i;
- SLIST_INSERT_HEAD(&S, n1, p);
- }
- n2 = SLIST_FIRST(&S);
- if(n2) printf("%s%d\n", n2->data.name, n2->data.value);
- for(i = 0; i < 30; i++)
- {
- n2 = SLIST_FIRST(&S);
- if(!n2) break;
- printf("%s%d\n", n2->data.name, n2->data.value);
- SLIST_REMOVE_HEAD(&S, p);
- free(n2);
- }
- }
复制代码 stack1.c 出自严蔚敏的书里,并稍做修改,我考虑的主要是减少数据拷贝,如果出入栈的数据是原子型,那还是用原书的代码吧
stack2.c 是queue.h的使用例子吧,我写出来主要是想是和上面代码进行比较,大家如果有更好的实现不妨也拿出来分享下 |
|