栈的 创建,入栈,出栈,清空栈,遍历栈 的实现

本文深入讲解了栈数据结构的基本概念,包括静态栈和动态栈的实现方式,以及入栈、出栈、遍历和清空栈的具体操作。通过C语言代码示例,详细解释了如何创建、使用和维护栈,为读者提供了全面的栈操作指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

数据结构 的学习视频 https://www.bilibili.com/video/av6159200?from=search&seid=6709590585276522157

一 算法:

栈: 数据进出,类向箱子放东西和拿东西,先进后出,或者说后进先出。栈分为静态栈和动态栈两种,静态栈用数组实现,

动态栈用链表实现。算法  出栈 入栈(压栈),遍历,清空。

1.创建栈

栈包括栈顶指针和栈底指针。 栈顶指针存放,栈顶元素地址,栈底指针存放栈底元素地址。

typedef struct Stack
{
    PNODE pTop;//栈顶指针 
    PNODE pBottom;//栈底指针 
} STACK,* PSTACK; 

2.入栈

入栈分为三步。第一新建一个节点。第二步,新建节点的指针域指向栈顶。第三步将栈顶指向新建节点。

void push(PSTACK pS,int val )
{
    PNODE pNew=(PNODE)malloc (sizeof (NODE));
    pNew->data=val;
    pNew->pNext= pS->pTop;//新建节点指针域指向栈顶值 ,不能写pS->butttom;
    pS->pTop = pNew ;           //更新栈顶指针 ,指向新节点 
    return;
 } 

3.出栈

 

  1. 创建一个数据节点的指针,保存栈顶地址。2然后栈顶指针指向栈顶的下一位置的地址

3.释放栈顶

 

 

 

void push(PSTACK pS,int val )
{
    PNODE pNew=(PNODE)malloc (sizeof (NODE));
    pNew->data=val;
    pNew->pNext= pS->pTop;//新建节点指针域指向栈顶值 ,不能写pS->butttom;
    pS->pTop = pNew ;           //更新栈顶指针 ,指向新节点 
    return;
 } 

 

 

4.创建两个指针p,q,一个指向栈顶,一个指向栈顶的下一位置。滑动清空

 

只是删除数据元素,表还在。

 void clear(PSTACK pS)

 {

  if(empty(pS))

 { return ;

  }

else

{

 PNODE p=pS->pTop;

 PNODE q=NULL;

 while(p!=pS->pBottom) //往下滑动删除  

 {

    q=p->pNext;//q指向下一个节点

  free(p);

  p=q;//更新

  }

  pS->pTop=pS->pBottom;//清空完成

}

  }

二 程序

include"stdio.h" 

#include"stdlib.h"
#include"malloc.h"
typedef struct Node //数据节点 
{
    int data;
    struct Node *pNext;
    
}NODE,* PNODE;
typedef struct Stack
{
    PNODE pTop;//栈顶指针 
    PNODE pBottom;//栈底指针 
} STACK,* PSTACK;
void init(PSTACK);//需要传入结构体指针 ,否则不改变结构体内元素的值 
void push(PSTACK ,int);//第一个参数 向那个栈中压入元素,第二个是要压得值 
void traverse(PSTACK);//传入参数是栈指针 
bool pop(PSTACK,int *);//出栈 
void clear(PSTACK pS);//清空栈 
bool empty(PSTACK pS);//栈是否为空 
int main()
{
     STACK S;//STACK 
     int a;
     init(&S);//造出一个空栈 
     push(&S,1);//压元素  
     push(&S,2); //压元素 
     push(&S,3); //压元素 
     push(&S,4); //压元素 
     push(&S,5); //压元素
     push(&S,6); //压元素 
     traverse(&S);//遍历 
     if(pop(&S,&a)) //进行一次出栈 
     {
         printf("出栈成功,出栈的元素是%d\n",a);
     }
     else 
     {
         printf("出栈失败\n"); 
     }
      traverse(&S);//遍历 
       clear(&S);//清空栈 
      if(empty(&S))
         {
             printf("栈被清空\n"); 
              }     
    return 0;
}
void push(PSTACK pS,int val )
{
    PNODE pNew=(PNODE)malloc (sizeof (NODE));
    pNew->data=val;
    pNew->pNext= pS->pTop;//新建节点指针域指向栈顶值 ,不能写pS->butttom;
    pS->pTop = pNew ;           //更新栈顶指针 ,指向新节点 
    return;
 } 
 /*造出一个空栈 
 */
void init (PSTACK pS) //S的地址付给pS 
{
    pS->pTop=(PNODE)malloc(sizeof(NODE));
    if (NULL==pS->pTop)
    {
        printf("动态内存分配失败!\n");
        exit(-1);
    }
    pS->pBottom=pS->pTop;//指向第一个节点
    pS->pTop->pNext=NULL;// pS->pBottom->pNext=NULL清空指针区域 
}
/*遍历栈*/ 
void traverse(PSTACK pS)
{
    PNODE p=pS->pTop;  //找人先找地址,即找数据先找指针。 
    while(p!=pS->pBottom) 
    {
        printf("%d ",p->data);
        p=p->pNext;
    }
    printf("\n");
    return ;
}
bool empty(PSTACK pS)
{   if (pS->pTop==pS->pBottom)
      return true;
    else 
        return false;
 } 
/*把pS所指向的栈出栈一次,并把出栈的元素存入pVal
形参所指向的变量中,如果出栈失败,则返回false; */
bool pop(PSTACK pS,int *pVal)
{
    if(empty(pS)) //栈空出栈失败,不能写成&pS,pS存放的本身就是s的地址 
        {
            return false;
        }
     else 
     {
         PNODE r=pS->pTop;
         *pVal= r->data;
         pS->pTop=r->pNext;//和下句的free次序不能变,变得化,会找不到栈顶。 
         free(r);
         r=NULL;
         return true;
     }    
 } 
 
 //只是删除数据元素,表还在。 
 void clear(PSTACK pS)
 {
     if(empty(pS))
     { return ;
      } 
    else 
    {
         PNODE p=pS->pTop;
         PNODE q=NULL;
         while(p!=pS->pBottom) //往下滑动删除  
         { 
            q=p->pNext;//q指向下一个节点 
             free(p);
             p=q;//更新 
          } 
          pS->pTop=pS->pBottom;//清空完成 
   

 

三 程序的运行结果

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值