链栈练习
相关内容:栈的链式存储结构(链栈)
//链栈的初始化、判空、入栈、出栈、读取栈顶元素
//链栈的结点:数据域、指针域
#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;}elsereturn OK;
}
//链栈的入栈,由于出入栈只能在表头操作
//使用栈顶指针需要改变,使用指针的指针保存栈顶指针,方便修改其指向
Status Push(LinkStack *LS,int e){//无需判满,只有内存不满都可申请空间LinkNode *p;//新结点pp=(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);//删除当前表头结点preturn OK;
}
//链栈的读取栈顶元素
int GetElem(LinkStack *LS){if ((*LS)!=NULL)return (*LS)->data;elsereturn 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;
}