#include <stdio.h>
#include <malloc.h>
typedef struct Node{
int data;
struct Node* pNext;
}NODE,*PNODE;
typedef struct Stack{
PNODE pTop;
PNODE pBottom;
}STACK,*PSTACk;
void init(PSTACk);//栈初始化
void push(PSTACk);//入栈
void pop(PSTACk,int *);//出栈
void printStack(PSTACk);//打印栈
void clear(PSTACk);//栈清空
bool is_empty(PSTACk);//判断栈是否为空
int main(void){
//这时候已经分配了内存空间给S了,只不过是静态分配,而且是垃圾值
//接下来要通过动态分配把里面的内容进行初始化
Stack S;
int val;
init(&S);
push(&S);
push(&S);
push(&S);
push(&S);
printStack(&S);
pop(&S,&val);
printf("出栈的元素为:%d\n",val);
printStack(&S);
clear(&S);
printStack(&S);
return 0;
}
//栈初始化
void init(PSTACk pS){
pS->pTop = (PNODE)malloc( sizeof(NODE) );
if(pS->pTop == NULL){
printf("内存分配失败\n");
exit(-1);
}
pS->pBottom = pS->pTop;
pS->pTop->pNext = NULL;
}
//判断栈是否为空
bool is_empty(PSTACk pS){
if(pS->pTop == pS->pBottom){
return true;
} return false;
}
//入栈
void push(PSTACk pS){
printf("请输入你要入栈的元素值:");
int val;
scanf("%d",&val);
PNODE pNew = (PNODE)malloc( sizeof(NODE) );
pNew->data = val;
pNew->pNext = pS->pTop;//因为栈是先进后出的,所以整个链表的连接方向要反着
pS->pTop = pNew;
}
//打印栈元素
void printStack(PSTACk pS){
if(is_empty(pS) ){
printf("栈为空,不能打印\n");
return;
}
PNODE p = pS->pTop;
printf("当前栈元素为:");
while(p != pS->pBottom){
printf("%d ",p->data);
p = p->pNext;
}
printf("\n");
}
//出栈
void pop(PSTACk pS,int * pVal){
if(is_empty(pS) ){
printf("栈为空,不能出栈\n");
return;
}
PNODE p = pS->pTop;
*pVal = p->data;
pS->pTop = p->pNext;
free(p);
}
//栈清空
void clear(PSTACk pS){
if(is_empty(pS) ){
printf("栈为空,不能清空\n");
return;
}
PNODE p = NULL;
while(pS->pTop != pS->pBottom){
p = pS->pTop;
pS->pTop = pS->pTop->pNext;
free(p);
}
}