链式栈

/*
         数据结构:批量存储数据的一种方式
         栈结构      FILO:先进后出,后来居上的一种存储方式
         栈的基本属性:  栈内存       栈顶标记          栈的当前元素个数
         栈的基本操作:
                            入栈:把数据存储到栈内存中
                            出栈:把数据从栈内存中删除掉
                            获取栈顶元素:栈顶标记的元素

           根据实现方式:把栈分成两种:
                                                    链式栈和数组栈

            万金油操作:
                     判断是否为NULL
                     当前栈中数据个数


         队列         FIFO
                          先进先出,排列的方式
*/

/*
       链表栈:  链表的头插法就可以了
       栈内存和栈的区别
       栈:一种结构 
       栈内存:内存的存在形式
       实现:用堆内存实现栈结构
*/


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


/*栈是一种先进后出的结构,就好像是链表的头插法*/
/*链式栈:链表的头插法*/
/*链式栈,有链表的属性*/
//链表结构
//结构体:描述一个单一个体
struct   Node
{
          int   data;
          struct   Node* next;
};
struct   Node* createNode(int   data)
{
      struct   Node* newNode = (struct   Node*)malloc(sizeof(struct    Node));
      newNode->data = data;/*我们要为变量的属性初始化,因为变量只有初始化后,我们才能使用*/
      newNode->next = NULL;
      return   newNode;
}


//栈结构
struct   stack
{
         int    sizeStack;   /*栈当前元素个数*/
        struct    Node* stackTop;/*栈顶标记用指针stackTop去表示*/
}

//创建栈:描述栈的最初状态,即为空
struct   stack* createStack()
{
       struct   stack* pStack = (struct   stack*)malloc(sizeof(struct   stack));
       pStack->sizeStack = 0;
       pStack->stackTop = NULL;
       return   pStack;
}

//万金油函数
int   size(struct    stack* pStack)/*求以pStack为栈顶标记所表示栈的大小*/
{
       return     pStack->sizeStack;
}
int   empty(struct     stack* pStack)/*判断是否为空的函数*/
{
      return   pStack->sizeStack != 0;/*返回  1  表示不为NULL*/
}


/*入栈操作-->链表的头插法 ,这里用无头链表,栈顶指针永远指向第一个结点,为什么指向头结点,因为可以用栈顶指针表示整个链表*/
void    push(struct   stack* pStack, int   data)
/*入栈,入的是以这个栈顶指针指向的这个栈,录的元素是data*/
{
        //入栈就是链表的插入操作
        struct    Node* newNode = createNode(data);
        newNode->next = pStack->stackTop;
        pStack->stackTop = newNode;
        /*栈顶指针永远指向第一个结点*/   
        pStack->sizeStack++;
}


/*出栈:链表的删除。栈必须先进后出,否则不是栈。出栈:(无头链表的)头删法*/
void    pop(struct    stack*pStack)
{
      if(pStack->sizeStack == 0)
      {
          printf("栈为空,无法出栈!\n");
          return;
       }
       /*堆内存实现的栈,需要内存释放*/
       struct   Node* nextNode = pStack->stackTop->next;/*先保存要删除的结点的下一个结点*/
       free(pStack->stackTop);
       pStack->stackTop=nextNode;
       pStack->sizeStack--;
}


/*获取栈顶元素,栈顶所指向的元素*/
int   top(struct   stack* pStack)
{
     if(pStack->sizeStack == 0)
    {
             printf("栈为空,无法获取栈顶元素\n");
             return   0;
     }
     return   pStack->stackTop->data;
}





int   main()
{
       struct   stack* myStack = createStack();
       push(myStack,1);
        push(myStack,2);
        push(myStack,3);
        while (empty(myStack))
        {
                  printf("%d\t",top(myStack));
                  pop(myStack);
         }
      printf("\n");
       system("pause");
       return  0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值