链式栈的实现

栈的建立过程以及对应的操作
一、栈的组成
概念部分:栈是一种具有先进后出特点的内存块,主要类型有两种:链式栈内存和数组栈内存(此处我们只讨论链式栈内存)。链式栈的实现是由指针块内存(top和bottom存放在里边)和结点块内存(一个自己定义的结构体)组成,结点块内存是由:指针域和数据域组成,指针域的作用是连接下一个结点,数据域用于存储数据。
二、 操作实现部分:
第一步:需要建立两个结构体
接下来是第一个结构体:
typedef struct node{
int data;//此处我们暂且存储int型的数据
struct node *pNext;//用于指向下一个结点
}NODE,*PNODE;
接下来是第二个结构体:
typedef struct stack{
PNODE Top;//指向栈顶的指针
PNODE Bottom;//指向栈底的指针
}STACK,*PSTACK;
第二步:初始化栈建造一个空栈
执行本操作的目的:将栈的基本结构建立起来
为什么要建立一个空结点在这一步中很好的解释了。
初始化的过程简单的概述:生成一个空结点将Top指针和Bottom指针指向它,完成框架的建立。
void initStack(PSTACK pS){
PNODE pN;
pS->Top=(PNODE)malloc(sizeof(NODE));
pS->Bottom=pS->Top;
pN=pS->Top;
pN->pNext=NULL;
}
此时一个栈就建好了,但是这个栈只是一个空栈,因此我们需要进行几个操作 压栈和弹出操作以及遍历整个栈
1、向栈中压入数据-----压栈操作
操作过程:1、新生成一个结点和一个可以接收PSTACK的指针,通过这个指针获取Top指针的位置。
2、将PSTACK指针的地址赋值给新分配的结点的指针域
3、移动Top指针指向该结点
void pushStack(PSTACK pS){
PNODE pN;//用于接收PSTACK(pS->Top)的指针
int val;
pN=(PNODE)malloc(sizeof(NODE));//新生成的结点
pN->pNext=pS->Top;
pS->Top=pN;
printf("please enter the data:");
scanf("%d",&val);
pS->Top->data=val;//也可以是pN->data=val;
}
2、从栈中弹出数据------出栈操作
操作过程:1、申请一个新的指针用于获取Top指针的位置方便free()操作
2、移动Top指针让其指向栈顶结点的下一个结点
3、利用新的指针获取的地址释放栈顶结点
void popStack(PSTACK pS){
PNODE pN;
int val;
val=pS->Top->data;
printf("The data coming out of the stack is %d",val);
pN=pS->Top;
pS->Top=pS->Top->pNext;
free(pN);
}
3、遍历操作
操作过程:1、申请一个新指针,并将Top指针的地址赋值给这个指针
2、通过新的指针获取每个结点的数据域的数据
void traversalStack(PSTACK pS){
PNODE pN;
pN=pS->Top;//申请的新指针用于存储Top指针
while(pN->pNext){
printf("%d\n",pN->data);
pN->pNext=pN->pNext->pNext;
}
}



下面是可以直接运行的代码
#include<stdio.h>
#include<stdlib.h>
typedef struct node {
int data;//此处我们暂且存储int型的数据
struct node *pNext;//用于指向下一个结点
} NODE,*PNODE;
typedef struct stack {
PNODE Top;//指向栈顶的指针
PNODE Bottom;//指向栈底的指针
} STACK,*PSTACK;
void initStack(PSTACK pS) {
PNODE pN;
pS->Top=(PNODE)malloc(sizeof(NODE));
pS->Bottom=pS->Top;
pN=pS->Top;
pN->pNext=NULL;
printf("Initation successfully!\n");
}
void pushStack(PSTACK pS) {
PNODE pN;//用于接收PSTACK(pS->Top)的指针
int val;
pN=(PNODE)malloc(sizeof(NODE));//新生成的结点
pN->pNext=pS->Top;
pS->Top=pN;
printf("please enter the data:");
scanf("%d",&val);
pS->Top->data=val;//也可以是pN->data=val;
printf("Push successfully!\n");
}
void popStack(PSTACK pS) {
PNODE pN;
int val;
val=pS->Top->data;
printf("The data coming out of the stack is %d\n",val);
pN=pS->Top;
pS->Top=pS->Top->pNext;
free(pN);
}
void traversalStack(PSTACK pS) {
PNODE pN;
pN=pS->Top;//申请的新指针用于存储Top指针
while((pN->pNext)!=NULL) {
printf("%d",pN->data);
pN=pN->pNext;
}
}
int main() {
STACK S;
initStack(&S);
pushStack(&S);
pushStack(&S);
pushStack(&S);
popStack(&S);
traversalStack(&S);
return 0;
}
下面是运行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值