栈的代码实现
栈的思想
栈的核心思想为先进先出
栈的结构体和链表类似,但是有了一些升级,在节点的基础上增加了新的结构体STACK其中包含着顶指针以及底指针。**注意栈的结构体中两个指针得到格式为pNode!!!**因为这两个指针指向的数据类型为NODE类型的节点!
typedef struct NODE{
int data ;
struct NODE *pNext;
}NODE,*pNode;
typedef struct STACK{
pNode *Top;
pNode *Bottom;
}STACK,*pSTACK;
栈的基本操作
- init_stack()
栈的初始化思想为,在定义了一个栈的结构体之后,我们可以得到两个指针,但是这两个指针并没有指向任何一个结构体,此时并不是一个完整的结构体,应该先定义一个类似于链表中的头节点的Node,其中不存储任何数据,只用来保存指针。然后使两个指针指向Node即可
void init_stack(pSTACK pS){
pNode pNew=(pNode)malloc(sizeof(NODE));
if (pNew==NULL){
printf("分配内存失败!\n");
exit(-1);
}
else{
pS->Bottom=pNew;
pS->Top=pNew;
}
}
- push()
入栈操作,只需要注意指针的指向即可
void push(pSTACK pS,int value){
pNode pNew=(pNode)malloc(sizeof(NODE));
pNew->data=value;
pNew->pNext=pS->Top;
pS->Top=pNew;
}
- pop()
出栈的注意事项为被弹出的Node记得free一下
void pop(pSTACK pS,int value ){
if(pS->Top!=pS->Bottom){
pNode p=pS->Top;
value=p->data;
pS->Top=p->pNext;
free(p);
p=NULL;
}
printf("the pop number is %d\n",value);
}
完整的代码示例
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define NULL 0
typedef struct NODE{
int data ;
struct NODE *pNext;
}NODE,*pNode;
typedef struct STACK{
pNode *Top;
pNode *Bottom;
}STACK,*pSTACK;
void init_stack();
void push();
void pop();
void show_stack();
int main(){
STACK S;
pSTACK pS=&S;
init_stack(pS);
push(pS,5);
push(pS,6);
push(pS,7);
show_stack(pS);
printf("\n");
pop(pS);
pop(pS);
show_stack(pS);
}
void init_stack(pSTACK pS){
pNode pNew=(pNode)malloc(sizeof(NODE));
if (pNew==NULL){
printf("分配内存失败!\n");
exit(-1);
}
else{
pS->Bottom=pNew;
pS->Top=pNew;
}
}
void push(pSTACK pS,int value){
pNode pNew=(pNode)malloc(sizeof(NODE));
pNew->data=value;
pNew->pNext=pS->Top;
pS->Top=pNew;
}
void show_stack(pSTACK pS){
pNode p=pS->Top;
while (p!=pS->Bottom){
printf("%d\n",p->data);
p=p->pNext;
}
}
void pop(pSTACK pS,int value ){
if(pS->Top!=pS->Bottom){
pNode p=pS->Top;
value=p->data;
pS->Top=p->pNext;
free(p);
p=NULL;
}
printf("the pop number is %d\n",value);
}