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 ",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 ",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; }