33_栈程序演示.swf

 

pBottom执行栈底有效元素的前一个节点,该节点没有存储有效数据,这样设计是便于栈的管理,向链表一样pHead指向链表的第一个节点,该节点是不存储有效数据的

pTop执行栈顶最新的节点

如果pTop和pBottom的值一样,说明栈是空的

经过初始化栈之后,栈的结构是:

 

向栈中添加一个数据

所以pBottom永远执行栈顶有效节点的前一个节点,该节点不存储有效数据,该节点的pNext下一个节点为NULL

 

 

复制代码
#include<stdio.h>
#include<malloc.h>
#include <stdio.h>  
#include <stdlib.h>  

/*
使用链表使用一个栈的数据结构 

*/ 
//定义一个链表的节点 
typedef struct Node{
    int data;//数据域
    struct Node * pNext; 
}NODE,*PNODE;


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


/*初始化栈
void init(struct Stack*  pStack){
*/
void initStack(PSTACK pStack){
    pStack->pTop  = (PNODE)malloc(sizeof(NODE));
    if(NULL == pStack->pTop ){
        printf("分配内存失败");
        exit(-1);
    }else{
        pStack->pBottom = pStack->pTop;//二者指向同一个内存单元
        pStack->pBottom->pNext = NULL; //pBottom指向栈底有效节点的前一个节点,该节点不存储有效数据,该节目之前没有任何其他节点 
    }
    
}

/*
将数据放入栈中 

*/
void pushStack(PSTACK pStack,int val){
        PNODE pNew  = (PNODE)malloc(sizeof(NODE));//产生一个新的节点 
        pNew->data = val;//把值添加到新的节点中 
        pNew->pNext = pStack->pTop;//让新的节点的下一个节点等于现在栈顶
        pStack->pTop = pNew;//最新栈顶的值等于最新的节点
             
}

/**对栈的数据进行遍历操作
栈的数据是先进后出 
定义一个变量p,在遍历的时候只有p不等于pBottom,就可以将p的值输出 
*/

void  traverse(PSTACK pStack){
        PNODE p =  pStack->pTop;
        //对p进行遍历输出
         while(p != pStack->pBottom){
             //输出变量的结果
             printf("%d\n",p->data); 
             p = p->pNext;
         }
} 

int main(){
    STACK s;//
    initStack(&s);
    pushStack(&s,1);
    pushStack(&s,2);
    pushStack(&s,3);
    pushStack(&s,4);
    traverse(&s);
    return 0;
}
复制代码

我们来看程序的运行效果是:

 可以完善下面的代码:

复制代码
#include<stdio.h>
#include<malloc.h>
#include <stdio.h>  
#include <stdlib.h>  

/*
使用链表使用一个栈的数据结构 

*/ 
//定义一个链表的节点 
typedef struct Node{
    int data;//数据域
    struct Node * pNext; 
}NODE,*PNODE;


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


/*初始化栈
void init(struct Stack*  pStack){
*/
void initStack(PSTACK pStack){
    pStack->pTop  = (PNODE)malloc(sizeof(NODE));
    if(NULL == pStack->pTop ){
        printf("分配内存失败");
        exit(-1);
    }else{
        pStack->pBottom = pStack->pTop;//二者指向同一个内存单元
        pStack->pBottom->pNext = NULL; //pBottom指向栈底有效节点的前一个节点,该节点不存储有效数据,该节目之前没有任何其他节点 
    }
    
}

/*
将数据放入栈中 

*/
void pushStack(PSTACK pStack,int val){
        PNODE pNew  = (PNODE)malloc(sizeof(NODE));//产生一个新的节点 
        pNew->data = val;//把值添加到新的节点中 
        pNew->pNext = pStack->pTop;//让新的节点的下一个节点等于现在栈顶
        pStack->pTop = pNew;//最新栈顶的值等于最新的节点
             
}


/*判断栈是否是空*/
bool isEmpty(PSTACK pStack){
    if(pStack->pTop == pStack->pTop){
        return true;//空栈 
    }else{
        return false;
    }
}

/*数据的出栈,将出栈的数据保存到int*val中*/
bool  popStack(PSTACK pStack,int*val){

    if(isEmpty(pStack)){//栈是空的
      return false; 
        
    }else{
     PNODE p = pStack->pTop;
  (*val) = p->data;
  pStack->pTop = p->pNext;
  free(p); //一定要记得释放内存 
  p= NULL; 
  return true    
    }
 
}


/*清空栈的元素
让栈回到初始化的状态 
*/
void clear(PSTACK pStack){
    if(isEmpty(pStack)){//栈是空的
      return ;         
    }else{
     PNODE p = pStack->pTop;
      PNODE q = NULL;
      while(p != pStack->pBottom  ){
          q = p->pNext;
        free(p);
        p=q;        
      }    
      //最后
      pStack->pTop = pStack->pBottom; 
    }
    
    
}


/**对栈的数据进行遍历操作
栈的数据是先进后出 
定义一个变量p,在遍历的时候只有p不等于pBottom,就可以将p的值输出 
*/

void  traverse(PSTACK pStack){
        PNODE p =  pStack->pTop;
        //对p进行遍历输出
         while(p != pStack->pBottom){
             //输出变量的结果
             printf("%d\n",p->data); 
             p = p->pNext;
         }
} 

int main(){
    STACK s;//
    initStack(&s);
    pushStack(&s,1);
    pushStack(&s,2);
    pushStack(&s,3);
    pushStack(&s,4);
    traverse(&s);
    return 0;
}
复制代码

 

posted on   luzhouxiaoshuai  阅读(164)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示