动态栈总结

/*链表的应用之一就是栈,栈的操作是简化的单链表的操作
  栈的构造,可以当成是常见单链表的逆序,为什么说栈是
  单链表的简化呢,因为其借助单链表的实现,同时对其操作
  加以限制,即人们常说的“先进后出”,或“后进先出”的
  规则,下面是具体的代码实现。*/

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

//栈的操作通常有栈的初始化、压栈、出栈、遍历栈、清空栈。

/*算法的定义就是对存储数据的操作,即对数据结构的操作,与单链表

  相比,栈可以算是一种算法,不过是一种非常简单的算法,真正的算法

  通常是栈的应用,即表达式求值,函数调用、中断、内存分配、缓冲分配

  以及迷宫,栈的应用将在后续的文章中给出,本章只讲述栈的基本操作。*/

//结点结构体的定义
typedef struct Node{
         int data;                   //数据域
         struct Node *next;  //指针域
}NODE, *PNODE;

//栈的结构体,这是完成栈的操作的必要条件
typedef struct Stack{
          PNODE pTop;            //栈顶指针
          PNODE pBottom;     //栈底指针
}STACK, *PSTACK;


//栈的初始化
void InitStack(PSTACK pst);

//压栈
void PushStack(PSTACK pst, int val);

//出栈
void PopStack(PSTACK pst, int *val);

//判断栈是否为空
bool IsEmpty(PSTACK pst);

//遍历栈
void TraverseStack(PSTACK pst);

//清空栈
void ClearStack(PSTACK pst);

void main(void)
{
       STACK st;
       int val;

       InitStack(&st);

       PushStack(&st, 12);
       PushStack(&st, 1);
       PushStack(&st, 23);
       PushStack(&st, 123);
       PushStack(&st, 45);
       PushStack(&st, 3);

      TraverseStack(&st);

      PopStack(&st, &val);

      TraverseStack(&st);

     ClearStack(&st);

     TraverseStack(&st);

      return;
}

//栈的初始化,即构建一个空栈。
void InitStack(PSTACK pst)
{
        pst->pTop = (PNODE)malloc(sizeof(NODE));
        if (NULL == pst->pTop)
        {
                 printf("分配动态内存失败!\n");
                 exit(-1);
         }
 
         pst->pBottom = pst->pTop;
         pst->pBottom->next = NULL;

         return;
}

//判断栈是否为空
bool IsEmpty(PSTACK pst)
{
        if (pst->pBottom == pst->pTop)
        {
              return true;
        }
       else
        {
              return false;
        }
}

//压栈
void PushStack(PSTACK pst, int val)
{
         PNODE pNew = (PNODE)malloc(sizeof(NODE));
         if (NULL == pNew)
         {
                 printf("压栈分配内存失败!\n");
                 exit(-1);
         }

         pNew->data = val;
         pNew->next = pst->pTop;
         pst->pTop = pNew;

          return;
}

//遍历栈,输出方式是从顶到底的顺序
void TraverseStack(PSTACK pst)
{
          if (IsEmpty(pst))
         {
              printf("栈为空!\n");
  
               return;
          }
         PNODE p;
         p = pst->pTop;
         while (pst->pBottom != p)
        {
               printf("%d ", p->data);
               p = p->next;
        }
         printf("\n");
 
         return;
}

//出栈,将栈顶的元素输出。
void PopStack(PSTACK pst, int *val)
{
        if (IsEmpty(pst))
        {
              printf("栈为空,无元素可出栈!\n");
  
              return;
        }

       PNODE p;
       p = pst->pTop;
       *val = p->data;
        printf("出栈的元素为:%d\n", *val);
        pst->pTop = p->next;
        free(p);
        p = NULL;

        return;
}

//清空栈
void ClearStack(PSTACK pst)
{
       if (IsEmpty(pst))
      {
             printf("栈为空,无需清空!\n");

             return;
       }

       PNODE p = pst->pTop;
       PNODE q;

       while (pst->pBottom != p)
       {
             q = p->next;
             free(p);
             p = q;
       }

      pst->pTop = pst->pBottom;

       return;

}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值