Chinaunix首页 | 论坛 | 博客
  • 博客访问: 388859
  • 博文数量: 55
  • 博客积分: 1907
  • 博客等级: 上尉
  • 技术积分: 869
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-04 19:30
文章分类

全部博文(55)

文章存档

2011年(32)

2010年(23)

分类: C/C++

2011-10-14 17:39:22

1、利用静态数组实现堆栈
  1. /*
  2.  * 利用静态数组实现堆栈
  3.  */

  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <assert.h>

  7. #define STACK_TYPE int
  8. #define STACK_SIZE 100

  9. static STACK_TYPE stack[STACK_SIZE];
  10. static int top_element = -1;

  11. int is_empty(void)
  12. {
  13.     return top_element == -1;
  14. }

  15. int is_full(void)
  16. {
  17.     return top_element == STACK_SIZE - 1;
  18. }

  19. void push(STACK_TYPE value)
  20. {
  21.     assert(!is_full());
  22.     stack[ top_element] = value;
  23. }

  24. STACK_TYPE pop(void)
  25. {
  26.     assert(!is_empty());
  27.     return stack[top_element--];
  28. }

  29. int main()
  30. {
  31.     int i;
  32.     push(0);
  33.     push(1);
  34.     push(2);
  35.     push(3);
  36.     push(4);

  37.     for(i=0; i <= top_element; i )
  38.         printf("M", stack[i]);
  39.     printf("\n");

  40.     printf(" pop=%d\n", pop());

  41.     for(i=0; i <= top_element; i )
  42.         printf("M", stack[i]);
  43.     printf("\n");

  44.   exit(0);
  45. }
2、利用动态数组实现堆栈
  1. /*
  2.  * 利用动态数组实现堆栈
  3.  */

  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <malloc.h>
  7. #include <assert.h>

  8. #define STACK_TYPE int
  9. #define STACK_SIZE 100

  10. static STACK_TYPE *stack;
  11. static size_t stack_size;
  12. static int top_element = -1;

  13. /*
  14.  * malloc 动态分配数组,由 stack 指针指向的内存区是连续的
  15.  * 可以通过 stack[] 这种数组的形式来对分配的内存进行操作。
  16.  */
  17. void creat_stack(size_t size)
  18. {
  19.     assert(stack ==0); //确保堆栈只创建一次
  20.     stack_size = size;
  21.     stack = malloc(stack_size * sizeof(STACK_TYPE));
  22.     assert(stack != NULL); //确保内存分配成功
  23. }

  24. void destroy_stack(void)
  25. {
  26.     assert(stack_size > 0); //确保堆栈已存在
  27.     stack_size = 0;
  28.     free(stack);
  29.     stack = NULL;
  30. }

  31. int is_empty(void)
  32. {
  33.     assert(stack_size > 0); //确保堆栈已存在,测试一个不存在的堆栈是否为空是没有意义的。
  34.     return top_element == -1;
  35. }

  36. int is_full(void)
  37. {
  38.     assert(stack_size > 0); //确保堆栈已存在,测试一个不存在的堆栈是否为满是没有意义的。
  39.     return top_element == stack_size - 1;
  40. }

  41. void push(STACK_TYPE value)
  42. {
  43.     assert(!is_full());
  44.     stack[ top_element] = value;
  45. }

  46. STACK_TYPE pop(void)
  47. {
  48.     assert(!is_empty());
  49.     return stack[top_element--];
  50. }

  51. int main()
  52. {
  53.     int i;
  54.     creat_stack(10);
  55.     
  56.     push(5);
  57.     push(6);
  58.     push(7);
  59.     push(8);
  60.     push(9);

  61.     for(i=0; i <= top_element; i )
  62.         printf("M", stack[i]);
  63.     printf("\n");

  64.     printf(" pop=%d\n", pop());
  65.     printf(" pop=%d\n", pop());

  66.     for(i=0; i <= top_element; i )
  67.         printf("M", stack[i]);
  68.     printf("\n");

  69.     destroy_stack();
  70.   exit(0);
  71. }
3、利用单链表实现堆栈,这个堆栈没有长度限制
  1. /*
  2.  * 利用单链表实现堆栈,这个堆栈没有长度限制。
  3.  */

  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <malloc.h>
  7. #include <assert.h>

  8. #define STACK_TYPE int
  9. #define FALSE     0

  10. typedef struct STACK_NODE{
  11.     STACK_TYPE value;
  12.     struct STACK_NODE *next;
  13. }StackNode;

  14. static struct STACK_NODE *stack = NULL;

  15. int is_empty(void)
  16. {
  17.     return stack == NULL;
  18. }

  19. int is_full(void)
  20. {
  21.     return FALSE;//堆栈没有长度限制,永远都不会满
  22. }

  23. void push(STACK_TYPE value)
  24. {
  25.     struct STACK_NODE *new_node;
  26.     new_node = malloc(sizeof(StackNode));
  27.     assert(new_node != NULL);

  28.     new_node->value = value;
  29.     new_node->next = stack;
  30.     stack = new_node;
  31. }

  32. void pop(void)
  33. {
  34.     struct STACK_NODE *first_node;
  35.     assert(!is_empty());
  36.     first_node = stack;
  37.     stack = first_node->next;
  38.     free(first_node);
  39. }

  40. void destroy_stack(void)
  41. {
  42.     while (stack != NULL)
  43.         pop();
  44. }

  45. STACK_TYPE top()
  46. {
  47.     assert(!is_empty());
  48.     return stack->value;
  49. }

  50. int main(void)
  51. {
  52.     struct STACK_NODE *ptr;    

  53.     push(10);
  54.     push(20);
  55.     push(30);
  56.     push(40);

  57.     for (ptr = stack; ptr != NULL; ptr = ptr->next)
  58.         printf("M", ptr->value);
  59.     printf("\n");

  60.     printf(" pop=%d\n", top());
  61.     pop();

  62.     for (ptr = stack; ptr != NULL; ptr = ptr->next)
  63.         printf("M", ptr->value);
  64.     printf("\n");

  65.     destroy_stack();
  66.   exit(0);
  67. }
 
阅读(2145) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~