Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1045531
  • 博文数量: 573
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 66
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-28 16:21
文章分类

全部博文(573)

文章存档

2018年(3)

2016年(48)

2015年(522)

分类: C/C++

2015-12-02 14:52:49


点击(此处)折叠或打开

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. #define STACK_INIT_SIZE 10 /*栈空间的初始分配量*/
  5. #define STACKINCREAMENT 5 /*栈空间的分配增量*/
  6. #define SZ_STRING 32

  7. typedef char STRING[SZ_STRING];

  8. /*定义顺序栈的结构体:描述了栈的所有要素*/
  9. typedef struct stack
  10. {
  11.     STRING * base; /*栈底指针:指向指针的指针,即指向字符串的指针*/
  12.     STRING * top; /*栈顶指针*/
  13.     int stacksize; /*记录栈的大小*/
  14. }STACK;
  15. typedef STACK * StackPtr;

  16. int InitStack(StackPtr stackptr);
  17. int StackIsEmpty(STACK stack);
  18. int Push(StackPtr stackptr, STRING string);
  19. int Pop(StackPtr stackptr, STRING string);
  20. int GetTop(STACK stack, STRING string);
  21. int PrintStack(STACK stack);
  22. int StackLen(STACK stack);
  23. int DestroyStack(StackPtr stackptr);

  24. int main(int argc, char ** argv)
  25. {
  26.     /*
  27.     顺序存储栈的特点:
  28.     1,栈空间是预先静态分配的,以后需要时,再增大存储空间
  29.     2,有栈顶指针和栈底指针
  30.     3,栈顶指针始终在栈顶元素的下一个位置上
  31.     4,栈底在地址低端,栈顶在地址高端
  32.     */
  33.     printf("顺序存储栈的实现!\n");
  34.     int stat = -2;
  35.     STRING string;
  36.     printf("sizeof(STRING)=[%d], sizeof(string)=[%d]\n", sizeof(STRING), sizeof(string));
  37.     
  38.     //STACK stack; /*定义栈元素:会自动开辟一个元素的空间*/
  39.     
  40.     StackPtr stackptr = NULL; /*定义栈指针:需要手动开辟一个空间*/
  41.     stackptr = (StackPtr)malloc(sizeof(STACK));
  42.     InitStack(stackptr);
  43.     printf("111**************************************************************\n");
  44.     PrintStack(*stackptr);
  45.     
  46.     
  47.     stat = StackIsEmpty(*stackptr);
  48.     if(stat == 1)
  49.         printf("当前栈是空栈!\n");
  50.     else if(stat == 2)
  51.         printf("当前栈是非空栈!\n");
  52.     
  53.     memset(string, 0, sizeof(string));
  54.     strcpy(string, "AAA");
  55.     Push(stackptr, string);
  56.     memset(string, 0, sizeof(string));
  57.     strcpy(string, "BBB");
  58.     Push(stackptr, string);
  59.     memset(string, 0, sizeof(string));
  60.     strcpy(string, "CCC");
  61.     Push(stackptr, string);
  62.     memset(string, 0, sizeof(string));
  63.     strcpy(string, "DDD");
  64.     Push(stackptr, string);
  65.     memset(string, 0, sizeof(string));
  66.     strcpy(string, "EEE");
  67.     Push(stackptr, string);
  68.     memset(string, 0, sizeof(string));
  69.     strcpy(string, "FFF");
  70.     Push(stackptr, string);
  71.     memset(string, 0, sizeof(string));
  72.     strcpy(string, "GGG");
  73.     Push(stackptr, string);
  74.     memset(string, 0, sizeof(string));
  75.     strcpy(string, "HHH");
  76.     Push(stackptr, string);
  77.     memset(string, 0, sizeof(string));
  78.     strcpy(string, "III");
  79.     Push(stackptr, string);
  80.     memset(string, 0, sizeof(string));
  81.     strcpy(string, "JJJ");
  82.     Push(stackptr, string);
  83.     
  84.     stat = StackIsEmpty(*stackptr);
  85.     if(stat == 1)
  86.         printf("当前栈是空栈!\n");
  87.     else if(stat == 2)
  88.         printf("当前栈是非空栈!\n");
  89.     printf("222**************************************************************\n");
  90.     PrintStack(*stackptr);
  91.     memset(string, 0, sizeof(string));
  92.     strcpy(string, "KKK");
  93.     Push(stackptr, string);
  94.     memset(string, 0, sizeof(string));
  95.     strcpy(string, "LLL");
  96.     Push(stackptr, string);
  97.     memset(string, 0, sizeof(string));
  98.     strcpy(string, "MMM");
  99.     Push(stackptr, string);
  100.     memset(string, 0, sizeof(string));
  101.     strcpy(string, "NNN");
  102.     Push(stackptr, string);
  103.     memset(string, 0, sizeof(string));
  104.     strcpy(string, "OOO");
  105.     Push(stackptr, string);
  106.     printf("333**************************************************************\n");
  107.     PrintStack(*stackptr);
  108.     memset(string, 0, sizeof(string));
  109.     strcpy(string, "PPP");
  110.     Push(stackptr, string);
  111.     printf("444**************************************************************\n");
  112.     PrintStack(*stackptr);
  113.     
  114.     memset(string, 0, sizeof(string));
  115.     Pop(stackptr, string);
  116.     printf("string1=[%s]\n", string);
  117.     printf("555**************************************************************\n");
  118.     PrintStack(*stackptr);
  119.     memset(string, 0, sizeof(string));
  120.     Pop(stackptr, string);
  121.     printf("string2=[%s]\n", string);
  122.     printf("666**************************************************************\n");
  123.     PrintStack(*stackptr);
  124.     
  125.     GetTop(*stackptr, string);
  126.     printf("取得元素=[%s]\n", string);
  127.     printf("777**************************************************************\n");
  128.     PrintStack(*stackptr);
  129.     
  130.     memset(string, 0, sizeof(string));
  131.     Pop(stackptr, string);
  132.     memset(string, 0, sizeof(string));
  133.     Pop(stackptr, string);
  134.     memset(string, 0, sizeof(string));
  135.     Pop(stackptr, string);
  136.     memset(string, 0, sizeof(string));
  137.     Pop(stackptr, string);
  138.     memset(string, 0, sizeof(string));
  139.     Pop(stackptr, string);
  140.     memset(string, 0, sizeof(string));
  141.     Pop(stackptr, string);
  142.     memset(string, 0, sizeof(string));
  143.     Pop(stackptr, string);
  144.     memset(string, 0, sizeof(string));
  145.     Pop(stackptr, string);
  146.     memset(string, 0, sizeof(string));
  147.     Pop(stackptr, string);
  148.     memset(string, 0, sizeof(string));
  149.     Pop(stackptr, string);
  150.     memset(string, 0, sizeof(string));
  151.     Pop(stackptr, string);
  152.     memset(string, 0, sizeof(string));
  153.     Pop(stackptr, string);
  154.     memset(string, 0, sizeof(string));
  155.     Pop(stackptr, string);
  156.     memset(string, 0, sizeof(string));
  157.     Pop(stackptr, string);
  158.     memset(string, 0, sizeof(string));
  159.     Pop(stackptr, string);
  160.     printf("888**************************************************************\n");
  161.     DestroyStack(stackptr);
  162.     
  163.     return 0;
  164. }

  165. /*功能:栈的初始化*/
  166. int InitStack(StackPtr stackptr)
  167. {
  168.     stackptr->base = (STRING * )malloc(STACK_INIT_SIZE * sizeof(STRING));
  169.     /*stack-> 等价于 (*stack).*/
  170.     /*栈底指针指向开辟的空间的地址低端,开辟的空间的地址类型是:eletype*/
  171.     if(stackptr->base == NULL)
  172.     {
  173.         printf("malloc失败,退出程序\n");
  174.         exit(-1);
  175.     }
  176.     stackptr->top = stackptr->base; /*栈顶指针也指向地址低端,表明是空栈*/
  177.     stackptr->stacksize = STACK_INIT_SIZE; /*记录栈的容量,不是栈中元素个数*/
  178.     
  179.     return 0;
  180. }

  181. /*功能:判断栈是否为空 1:空栈,2:非空栈*/
  182. int StackIsEmpty(STACK stack)
  183. {
  184.     //栈顶和栈底相同,即可判断为空
  185.     if(stack.top == stack.base)
  186.         return 1;
  187.     else
  188.         return 2;
  189. }

  190. /*功能:入栈操作*/
  191. int Push(StackPtr stackptr, STRING string)
  192. {
  193.     /*要先判断栈是否已满*/
  194.     if((stackptr->top - stackptr->base) >= stackptr->stacksize)
  195.     {
  196.         /*top指针已经指向栈空间的最高地址的外面了。表示栈中元素已满:即“上溢”,则追加存储空间*/
  197.         stackptr->base = (STRING *)realloc(stackptr->base, (stackptr->stacksize + STACKINCREAMENT) * sizeof(STRING));
  198.         if(stackptr->base == NULL)
  199.         {
  200.             printf("realloc失败,退出程序\n");
  201.             exit(-1);
  202.         }
  203.         stackptr->top = stackptr->base + stackptr->stacksize; /*当前栈顶指针=栈底指针+栈的原来的容量*/
  204.         stackptr->stacksize = stackptr->stacksize + STACKINCREAMENT; /*栈的容量已经改变*/
  205.     }
  206.     //*(stackptr->top) = ele; //元素e入栈
  207.     strcpy(*(stackptr->top), string);
  208.     stackptr->top = (stackptr->top)++; //保证:栈顶指针始终在栈顶元素的下一个位置
  209.     
  210.     /*
  211.     *((*stackptr).top) = ele;
  212.     (*stackptr).top = (*stackptr).top + 1;
  213.     */
  214.     printf("入栈一个元素=[%s],栈空间大小=[%d],栈中元素个数=[%d]\n", string, stackptr->stacksize, StackLen(*stackptr));
  215.     return 0;
  216. }

  217. /*功能:出栈操作*/
  218. int Pop(StackPtr stackptr, STRING string)
  219. {
  220.     /*先判断是否是空栈*/
  221.     if(stackptr->top == stackptr->base)
  222.     {
  223.         printf("栈为空,无元素可出栈!\n");
  224.         return -1;
  225.     }
  226.     stackptr->top = stackptr->top -1;
  227.     //*ele = *(stackptr->top);
  228.     strcpy(string, *(stackptr->top));
  229.     printf("出栈一个元素=[%s],栈空间大小=[%d],栈中剩余元素个数=[%d]\n", string, stackptr->stacksize, StackLen(*stackptr));
  230.     return 0;
  231. }

  232. /*功能:取栈顶元素*/
  233. int GetTop(STACK stack, STRING string)
  234. {
  235.     /*先判断是否是空栈*/
  236.     if(stack.top == stack.base)
  237.     {
  238.         printf("栈为空,无栈顶元素可取!\n");
  239.         return -1;
  240.     }
  241.     stack.top = stack.top -1; /*只是取栈顶元素,不可移动栈顶指针*/
  242.     //*ele = *(stack.top);
  243.     strcpy(string, *(stack.top));
  244.     printf("当前栈顶元素=[%s]!\n", string);
  245.     return 0;
  246. }

  247. /*功能:打印栈中的所有元素*/
  248. int PrintStack(STACK stack)
  249. {
  250.     printf("栈空间大小=[%d],栈中元素个数=[%d]\n", stack.stacksize, StackLen(stack));
  251.     /*先判断是否是空栈*/
  252.     if(stack.top == stack.base)
  253.     {
  254.         printf("栈为空,无需打印栈中元素!\n");
  255.         return -1;
  256.     }
  257.     int num = 0;
  258.     stack.top = stack.top -1;
  259.     printf("从栈顶开始:\n");
  260.     while(stack.top != stack.base)
  261.     {
  262.         num++;
  263.         printf("(第%02d个元素)=[%s]\n", num, *(stack.top));
  264.         (stack.top)--;
  265.     }
  266.     if(stack.top == stack.base) /*说明已经指向栈底了*/
  267.     {
  268.         num++;
  269.         printf("(第%02d个元素)=[%s]\n", num, *(stack.top));
  270.     }
  271.         
  272.     return 0;
  273. }

  274. /*功能:求栈中元素的个数*/
  275. int StackLen(STACK stack)
  276. {
  277.     int num = 0;
  278.     /*先判断是否是空栈*/
  279.     if(stack.top == stack.base)
  280.     {
  281.         /*printf("栈为空!\n");*/
  282.         num = 0;
  283.         return num;
  284.     }
  285.     stack.top = stack.top -1;
  286.     while(stack.top != stack.base)
  287.     {
  288.         num++;
  289.         (stack.top)--;
  290.     }
  291.     if(stack.top == stack.base) /*说明已经指向栈底了*/
  292.     {
  293.         num++;
  294.     }
  295.     
  296.     return num;
  297. }

  298. /*功能:销毁栈*/
  299. int DestroyStack(StackPtr stackptr)
  300. {
  301.     free(stackptr->base);
  302.     stackptr->base = NULL;
  303.     stackptr->top = NULL;
  304.     stackptr->stacksize = 0;
  305.     printf("顺序栈已销毁!\n");
  306.     
  307.     return 0;
  308. }

  309. /*功能:将栈中元素清空(栈还在,不是销毁栈)*/
  310. int ClearStack(StackPtr stackptr)
  311. {
  312.     return 0;
  313. }

阅读(584) | 评论(0) | 转发(0) |
0

上一篇:链式栈

下一篇:任意数制的转换

给主人留下些什么吧!~~