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 2017-06-05 15:25  luzhouxiaoshuai  阅读(161)  评论(0编辑  收藏  举报

导航