Chinaunix首页 | 论坛 | 博客
  • 博客访问: 331391
  • 博文数量: 73
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1293
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-07 11:17
个人简介

爱运动,爱看书,爱生活!

文章分类

全部博文(73)

文章存档

2014年(7)

2013年(66)

分类: C/C++

2013-09-04 16:43:32

/*
堆栈也分为顺序栈和链式堆栈,堆栈只能对栈的一端进行操作
入栈和出栈操作均在这一端,叫做栈顶,为了操作方便,引入
了栈顶指示器
顺序堆栈的特点:
1.时间复杂度为O(1)
2.存储空间是限定大小的
3.操作比较简单和方便
链式堆栈的特点:
1.时间复杂度也为O(1),但撤销操作的时间复杂度为O(n)
*/
顺序堆栈的实现

点击(此处)折叠或打开

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

  3. #define MAXSIZE 10

  4. typedef struct stack{
  5.     int data[MAXSIZE];
  6.     int top;
  7. }stack;

  8. //初始化堆栈
  9. int init(stack *s)
  10. {
  11.     s->top=0;
  12. }
  13. //是否为空
  14. int isEmpty(stack *s)
  15. {
  16.     if(s->top<=0) return 0;
  17.     else
  18.         return 1;
  19. }
  20. //入栈
  21. int push(stack *s,int a)
  22. {
  23.     if(s->top>=MAXSIZE){
  24.         printf("堆栈已满。\n");
  25.         return 0;    
  26.     }
  27.     s->data[s->top]=a;
  28.     s->top++;
  29.     return 1;
  30. }
  31. //出栈
  32. int out(stack *s)
  33. {
  34.     if(s->top<=0){
  35.         printf("堆栈为空。\n");    
  36.         return 0;
  37.     }
  38.     s->top--;
  39.     return s->data[s->top];
  40.     
  41. }
  42. //取栈顶元素
  43. int get(stack *s)
  44. {
  45.     if(s->top>=MAXSIZE){
  46.         printf("堆栈空。\n");
  47.         return 0;
  48.     }
  49.     return s->data[s->top-1];
  50. }
  51. int main()
  52. {
  53.     int i;
  54.     stack s;
  55.     init(&s);
  56.     for(i=0;i<MAXSIZE;i++){
  57.         push(&s,i);
  58.     }
  59.     for(i=0;i<MAXSIZE;i++){
  60.         printf("%d ",out(&s));
  61.     }
  62.     printf("\n");
  63.     return 0;
  64. }
//链式堆栈的实现
/*
若把链式堆栈设计成带头节点的结构
则入栈和出栈操作的是head->next
头指针参数可以设计成节点的指针类型
若把链式堆栈设计成不带头节点的,则插入
和删除操作的改变都是头指针的的值,则头指针参数
必须设计成节点的双重指针。
这里把链式堆栈设计成带头节点的结构
*/

点击(此处)折叠或打开

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

  3. typedef struct Lnode{
  4.     int data;
  5.     struct Lnode *next;
  6. }Lnode;
  7. //初始化
  8. void init(Lnode **head)
  9. {
  10.     *head=(Lnode*)malloc(sizeof(Lnode));
  11.     (*head)->next=NULL;
  12. }
  13. //非空否
  14. int isEmpty(Lnode *l)
  15. {
  16.     if(l->next==NULL) return 0;
  17.     else return 1;
  18. }

  19. //入栈
  20. void push(Lnode *l,int a)
  21. {
  22.     Lnode *p;
  23.     p=(Lnode *)malloc(sizeof(Lnode));
  24.     p->data=a;

  25.     p->next=l->next;//新的节点入栈
  26.     l->next=p;//新的节点成为新的栈顶元素
  27. }


  28. //出栈
  29. int out(Lnode *l)
  30. {
  31.     if(l->next==NULL){
  32.         printf("栈为空.\n");
  33.         return 0;
  34.     }
  35.     Lnode *p=l->next;//构造一个指针指向栈顶元素
  36.     int d;
  37.     d=p->data;//获得数据
  38.     l->next=p->next;//改变栈顶元素

  39.     free(p);//释放p
  40.     return d;
  41. }
  42. //取栈顶元素
  43. int get(Lnode *l)
  44. {
  45.     if(l->next==NULL){
  46.         printf("stack is null\n");
  47.         return;
  48.     }
  49.     return l->next->data;
  50. }
  51. //撤销空间
  52. void destroy(Lnode *l)
  53. {
  54.     Lnode *p,*p1;
  55.     p=l->next;
  56.     while(p!=NULL){
  57.         p1=p;
  58.         p=p->next;
  59.         free(p1);
  60.     }
  61. }

  62. int main()
  63. {

  64.     Lnode *l;
  65.     init(&l);
  66.     int i;
  67.     for(i=0;i<MAXSIZE;i++){
  68.         push(l,i);
  69.     }
  70.     printf("栈顶:%d\n",get(l));
  71.     while(isEmpty(l)){
  72.         printf("%d ",out(l));
  73.     }
  74.     printf("\n");
  75.     return 0;
  76. }


阅读(3220) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~