现在的位置: 首页 > 综合 > 正文

stack栈

2012年11月28日 ⁄ 综合 ⁄ 共 5909字 ⁄ 字号 评论关闭

./Makefile:

      1 mytest:main.o stack.o                                                                                      
      2     gcc $^ -o $@
      3 main.o:main.c
      4     gcc -I include -c $^ -o $@
      5 stack.o:stack.c
      6     gcc -I include -c $^ -o $@
      7
      8 clean:
      9     rm main.o stack.o mytest

./include/stack.h:

      1 #ifndef __Jerry_stack__                                                                                    
      2 #define __Jerry_stack__
      3
      4 typedef int stackelem;
      5 typedef stackelem * pstackelem;
      6
      7 typedef struct stack
      8 {
      9     stackelem *base;
     10     stackelem *top;
     11
     12     int stacksize;
     13
     14     void * (*initstack)  (void);
     15     void (*destory)   (struct stack *pstack);
     16     int (*incstack)   (struct stack **ppstack);
     17     int (*pushstack)  (struct stack *pstack, stackelem *elem);
     18     int (*popstack)  (struct stack *pstack, stackelem *elem);
     19     int (*sizestack)  (struct stack *pstack);
     20     int (*fullstack)  (struct stack *pstack);
     21     int (*emptystack)  (struct stack *pstack);
     22 }stack;
     23
     24 typedef stack * pstack;
     25
     26 #define STACKINCRSIZE (sizeof(stackelem) << 4)
     27 #define STACKINTSIZE  (STACKINCRSIZE << 10)
     28
     29
     30 /*now, I would like to use C++, but......*/
     31 extern void * initstack(void);
     32 extern void  destory(stack *pstack);
     33 /*with the help of C++, I will not use extern*/
     34
     35 /*use your own method */
     36 #define PUSH(pposition, pvar) \
     37     do \
     38     { \
     39         *(pposition) = *pvar;     \
     40         ++pposition;                  \
     41                                   \
     42     }while(0)
     43
     44
     45 /*use your own method */
     46 #define POP(pposition, pvar) \
     47     do \
     48     { \
     49         --pposition;         \
     50         *pvar = *pposition;  \
     51                              \
     52     }while(0)
     53
     54 /*use your own method */
     55 #define FREE(ppoistion) \
     56     do \
     57     { \
     58         free(ppoistion); \
     59     }while(0)
     60
     61
     62 #endif    

./main.c:

      1 #include "stack.h"                                                                                         
      2 #include <stdio.h>
      3
      4 int main(void)
      5 {
      6     int teni = 18;
      7     int div,mod;
      8     int eighto;
      9     int err;
     10     stackelem elem;
     11
     12     pstack pnumberstack = initstack();
     13     if(!pnumberstack)
     14     {
     15         printf("init stack error\n");
     16         return -1;
     17     }
     18
     19
     20     mod = teni % 16;
     21     teni = teni /16;
     22     while (teni)
     23     {
     24         pnumberstack->pushstack(pnumberstack, &mod);
     25         mod = teni % 16;
     26         teni = teni / 16;
     27     }
     28
     29     pnumberstack->pushstack(pnumberstack, &mod);
     30     while (pnumberstack->top != pnumberstack->base)
     31     {
     32         pnumberstack->popstack(pnumberstack, &elem);
     33         printf("%d",elem);
     34     }
     35     printf("\n");
     36     destory(pnumberstack);
     37     return 0;
     38 }

./stack.c:

      1 #include "stack.h"                                                                                         
      2 #include <stdio.h>
      3 #include <malloc.h>
      4
      5
      6 static int sizestack(stack *pstack);
      7 static int fullstack(stack *pstack);
      8 static int emptystack(stack *pstack);
      9 static int incstack(stack **ppstack);
     10 static int pushstack(stack *pstack, stackelem *elem);
     11 static int popstack(stack *pstack, stackelem *elem);
     12
     13
     14 void * initstack(void)
     15 {
     16     stack *pstack = malloc(sizeof(stack));
     17
     18     if(!pstack)
     19     {
     20         printf("init stack error\n");
     21         goto err_1;
     22     }
     23
     24     pstack->stacksize = STACKINTSIZE;
     25     pstack->base = (stackelem *)malloc(STACKINTSIZE *sizeof(stackelem));
     26     if (!pstack->base)
     27     {
     28         printf("init stack error\n");
     29         goto err_2;
     30     }
     31
     32
     33     pstack->top = pstack->base;
     34
     35     pstack->initstack = initstack;
     36     pstack->destory = destory;
     37     pstack->sizestack = sizestack;
     38     pstack->fullstack = fullstack;
     39     pstack->emptystack = emptystack;
     40     pstack->incstack = incstack;

     41     pstack->pushstack = pushstack;
     42     pstack->popstack = popstack;
     43     return pstack;
     44
     45 err_2:
     46     free(pstack);
     47 err_1:
     48     return NULL;
     49 }
     50
     51 void destory(stack *pstack)
     52 {
     53     if (pstack->base)
     54         FREE(pstack->base);
     55     free(pstack);
     56 }
     57
     58 int sizestack(stack *pstack)
     59 {
     60     return pstack->top - pstack->base;
     61 }
     62
     63 int fullstack(stack *pstack)
     64 {
     65     if(sizestack(pstack) == pstack->stacksize)
     66         return 1;
     67     return 0;
     68 }
     69
     70 int emptystack(stack *pstack)
     71 {
     72     if(sizestack(pstack) == 0)
     73         return 1;
     74     return 0;
     75 }
     76
     77 int incstack(stack **ppstack)
     78 {
     79         (*ppstack)->base = realloc((*ppstack)->base,
     80                                   ((*ppstack)->stacksize + STACKINCRSIZE) * sizeof(stackelem));    

     81         if(!(*ppstack)->base)
     82         {
     83             printf("incstack error\n");
     84             return -1;
     85         }
     86         return 0;
     87 }
     88         
     89 int pushstack(stack *pstack, stackelem *elem)
     90 {
     91     if (fullstack(pstack))
     92     {
     93         int err;
     94         err = incstack(&pstack);
     95         if(err < 0)
     96         {
     97             printf("pushstack errro\n");
     98             return -1;
     99         }
    100     }
    101     PUSH(pstack->top, elem);
    102     return 0;
    103 }
    104
    105 int popstack(stack *pstack, stackelem *elem)
    106 {
    107     if (emptystack(pstack))
    108     {
    109         printf("popstack error\n");
    110         return -1;
    111     }
    112     POP(pstack->top, elem);
    113     return 0;
    114 }                                                                                                          

 

                                                                                               

抱歉!评论已关闭.