#include <stdio.h>
#include <stdlib.h>
typedef struct node{ //定义每个节点的类型
int data;
struct node* pNext;
}NODE,*PNODE;
typedef struct { //定义一个类型存储栈顶和栈底的地址
PNODE pTop;
PNODE pBootem;
}STACK,*PSTACK;
void init(PSTACK); //对栈进行初始化
void Push(PSTACK,int); //压栈
void traveserStack(STACK); //对栈进行遍历输出
void PopStack(PSTACK,int*); //出栈 后一个参数保存出栈数组的地址
void ClearStack(PSTACK); //清空栈
int main(int argc, const char * argv[])
{
STACK S;
int val;
init(&S);
Push(&S,4);
Push(&S,4);
Push(&S,4);
Push(&S,4);
Push(&S,4);
Push(&S,6);
PopStack(&S,&val);
printf("%d\n",val);
traveserStack(S);
ClearStack(&S);
traveserStack(S);
return 0;
}
void init(PSTACK pS){
pS->pTop = (PNODE)malloc(sizeof(NODE));
if (NULL == pS->pTop) {
printf("分配内存失败!");
}
else{
pS->pBootem = pS->pTop;
pS->pTop->pNext = NULL;
}
}
void Push(PSTACK pS,int val){
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->data = val; //压栈时,赋值
pNew->pNext = pS->pTop; //压栈时,新节点中的地址存储的是之前pTop的地址
pS->pTop = pNew; //pTop指向新的节点
}
void traveserStack(STACK S){
if (S.pTop == S.pBootem) {
printf("此栈为空!\n");
}
else{
while (S.pBootem != S.pTop) {
printf("%d ",S.pTop->data);
S.pTop = S.pTop->pNext;
}
printf("\n");
}
}
void PopStack(PSTACK pS,int* val){
if (pS->pTop == pS->pBootem) {
printf("此栈为空");
}
else{
*val = pS->pTop->data;
PNODE p = pS->pTop;
pS->pTop = pS->pTop->pNext;
free(p); //对p指向的内存空间进行释放
// p = NULL;
}
}
void ClearStack(PSTACK pS){
if (pS->pTop == pS->pBootem) {
printf("此栈为空");
}
else{
while (pS->pTop != pS->pBootem) {
PNODE p = pS->pTop;
pS->pTop = pS->pTop->pNext;
free(p);
}
}
}
栈的,压栈,出栈,遍历,清空算法代码演示
最新推荐文章于 2022-09-13 17:02:57 发布