链栈练习
相关内容:栈的链式存储结构(链栈)
//链栈的初始化、判空、入栈、出栈、读取栈顶元素
//链栈的结点:数据域、指针域
#include<stdio.h>
#include<stdlib.h>
typedef int Status;
#define OK 1
#define ERROR 0
typedef struct LNode
{
int data;
struct LNode *next;
}LinkNode,*LinkStack;
//链栈的初始化
Status InitLinkStack(LinkStack *LS){
(*LS)==NULL;//栈顶指针置空
return OK;
}
//链栈的判空
Status isEmpty(LinkStack *LS){
if ((*LS)==NULL)
{
return ERROR;
}else
return OK;
}
//链栈的入栈,由于出入栈只能在表头操作
//使用栈顶指针需要改变,使用指针的指针保存栈顶指针,方便修改其指向
Status Push(LinkStack *LS,int e){
//无需判满,只有内存不满都可申请空间
LinkNode *p;//新结点p
p=(LinkNode*)malloc(sizeof(LinkNode));
p->data=e;//元素赋值给结点数据域
p->next=(*LS);//新结点指向表头
(*LS)=p;//栈顶指针指向新结点使其成为新表的表头
return OK;
}
//链栈的出栈,由于出入栈只能在表头操作
//使用栈顶指针需要改变,使用指针的指针保存栈顶指针,方便修改其指向
Status Pop(LinkStack *LS,int *e){
if ((*LS)==NULL)//判空
return ERROR;
*e=(*LS)->data;//把表头结点数据取走
LinkNode *p;
p=(*LS);//p指向表头结点,一会删除
(*LS)=(*LS)->next;//后移栈顶指针,指向新表头结点
free(p);//删除当前表头结点p
return OK;
}
//链栈的读取栈顶元素
int GetElem(LinkStack *LS){
if ((*LS)!=NULL)
return (*LS)->data;
else
return 0;
}
int main(){
int n,e;
LinkStack LS;
InitLinkStack(&LS);
printf("初始化完成!\n");
if (!isEmpty(&LS))
printf("栈非空!\n");
printf("输入需要入栈的元素个数:");
scanf("%d",&n);
for (size_t i = 0; i < n; i++)
{
printf("输入第%d个入栈元素:",i+1);
scanf("%d",&e);
Push(&LS,e);
}
printf("栈顶元素为:%d\n",GetElem(&LS));
printf("所有元素出栈\n");
for (size_t i = 0; i < n; i++)
{
printf("输出第%d个出栈元素:",i+1);
Pop(&LS,&e);
printf("%d\n",e);
}
return 0;
}