⭐️写在前面的话⭐️
📒博客主页: 程序员好冰
🎉欢迎 【点赞👍 关注🔎 收藏⭐️ 留言📝】
📌本文由 程序员好冰 原创,优快云 首发!
📆入站时间: 🌴2022 年 07 月 13 日🌴
✉️ 是非不入松风耳,花落花开只读书。
💭推荐书籍:📚《Java编程思想》,📚《Java 核心技术卷》
💬参考在线编程网站:🌐牛客网🌐力扣
🍭 作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!🍭
链栈的实现
初始化
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR -1
typedef int Status;
typedef int ElemType;
//定义每个结点的结构体
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode;
//定义整条链栈的结构体
typedef struct LinkStack
{
int count;
LNode *top;
}LinkStack;
Status InitStack(LinkStack*);
Status DestoryStack(LinkStack*);
Status ClearStack(LinkStack*);
Status StackIsEmpty(LinkStack);
Status StackLength(LinkStack);
Status GetTop(LinkStack);
Status Push(LinkStack*,ElemType);
Status Pop(LinkStack*);
Status PrintStack(LinkStack);
1、初始化栈
//1、初始化链栈
Status InitStack(LinkStack *L)
{
L->top=(LNode*)malloc(sizeof(LNode));
if(!L->top){
printf("空间分配失败,请重新操作.\n");
return ERROR;
}
L->top=NULL;
L->count=0;
printf("栈初始化成功.\n");
return OK;
}
2、销毁栈
//2、销毁栈
Status DestoryStack(LinkStack *L)
{
ClearStack(L);
free(L);
return OK;
}
3、清空栈
//3、清空栈
Status ClearStack(LinkStack *L)
{
LNode *temp;
while(!L->top){
temp=L->top;
L->top=L->top->next;
free(temp);
}
L->count=0;
printf("清空栈成功.\n");
return OK;
}
4、检查栈是否为空
//4、检查栈是否为空
Status StackIsEmpty(LinkStack L)
{
if(L.count==0){
printf("当前栈为空.\n");
return OK;
}
printf("当前栈不为空.\n");
return OK;
}
5、返回栈的长度
//5、返回栈的长度
Status StackLength(LinkStack L)
{
printf("当前栈的长度为%d.\n",L.count);
return OK;
}
6、返回栈顶元素
//6、返回栈顶元素
Status GetTop(LinkStack L)
{
if(L.count==0){
printf("栈空,请压栈后再操作.\n");
return ERROR;
}
printf("栈顶元素为:%d.\n",L.top->data);
return OK;
}
7、压栈
//7、压栈
Status Push(LinkStack *L,ElemType e)
{
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=L->top;
L->top=s;
L->count++;
printf("元素%d被压入.\n",e);
PrintStack(*L);
return OK;
}
8、弹栈
//8、出栈
Status Pop(LinkStack *L)
{
if(L->count==0){
printf("栈空,请压栈后再操作.\n");
return ERROR;
}
printf("元素%d被弹出.\n",L->top->data);
LNode *temp;
temp=L->top;
L->top=L->top->next;
free(temp);
L->count--;
PrintStack(*L);
return OK;
}
9、打印栈中所有元素
//9、打印栈中所有元素
Status PrintStack(LinkStack L)
{
if(L.count==0){
printf("栈空,请压栈后再操作.\n");
return ERROR;
}
printf("栈为:");
while(L.top){
printf("%d ",L.top->data);
L.top=L.top->next;
}
return OK;
}
主函数
int main()
{
LinkStack L;
printf("请继续操作...\n");
while(1){
int input;
int value;
printf("\n==========================\n");
printf("1、初始化链栈.\n");
printf("2、销毁栈.\n");
printf("3、清空栈.\n");
printf("4、检查栈是否为空.\n");
printf("5、返回栈的长度.\n");
printf("6、返回栈顶元素.\n");
printf("7、压栈.\n");
printf("8、弹栈.\n");
printf("9、打印栈中所有元素.\n");
printf("\n==========================\n");
printf("请输入对应操作的序号:");
scanf("%d",&input);
switch(input){
case 1:
InitStack(&L);
break;
case 2:
DestoryStack(&L);
break;
case 3:
ClearStack(&L);
break;
case 4:
StackIsEmpty(L);
break;
case 5:
StackLength(L);
break;
case 6:
GetTop(L);
break;
case 7:
printf("请输入需要压入的元素:");
scanf("%d",&value);
Push(&L,value);
break;
case 8:
Pop(&L);
break;
case 9:
PrintStack(L);
break;
}
}
return 0;
}
程序源码
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR -1
typedef int Status;
typedef int ElemType;
//定义每个结点的结构体
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode;
//定义整条链栈的结构体
typedef struct LinkStack
{
int count;
LNode *top;
}LinkStack;
Status InitStack(LinkStack*);
Status DestoryStack(LinkStack*);
Status ClearStack(LinkStack*);
Status StackIsEmpty(LinkStack);
Status StackLength(LinkStack);
Status GetTop(LinkStack);
Status Push(LinkStack*,ElemType);
Status Pop(LinkStack*);
Status PrintStack(LinkStack);
//1、初始化链栈
Status InitStack(LinkStack *L)
{
L->top=(LNode*)malloc(sizeof(LNode));
if(!L->top){
printf("空间分配失败,请重新操作.\n");
return ERROR;
}
L->top=NULL;
L->count=0;
printf("栈初始化成功.\n");
return OK;
}
//2、销毁栈
Status DestoryStack(LinkStack *L)
{
ClearStack(L);
free(L);
return OK;
}
//3、清空栈
Status ClearStack(LinkStack *L)
{
LNode *temp;
while(!L->top){
temp=L->top;
L->top=L->top->next;
free(temp);
}
L->count=0;
printf("清空栈成功.\n");
return OK;
}
//4、检查栈是否为空
Status StackIsEmpty(LinkStack L)
{
if(L.count==0){
printf("当前栈为空.\n");
return OK;
}
printf("当前栈不为空.\n");
return OK;
}
//5、返回栈的长度
Status StackLength(LinkStack L)
{
printf("当前栈的长度为%d.\n",L.count);
return OK;
}
//6、返回栈顶元素
Status GetTop(LinkStack L)
{
if(L.count==0){
printf("栈空,请压栈后再操作.\n");
return ERROR;
}
printf("栈顶元素为:%d.\n",L.top->data);
return OK;
}
//7、压栈
Status Push(LinkStack *L,ElemType e)
{
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=L->top;
L->top=s;
L->count++;
printf("元素%d被压入.\n",e);
PrintStack(*L);
return OK;
}
//8、出栈
Status Pop(LinkStack *L)
{
if(L->count==0){
printf("栈空,请压栈后再操作.\n");
return ERROR;
}
printf("元素%d被弹出.\n",L->top->data);
LNode *temp;
temp=L->top;
L->top=L->top->next;
free(temp);
L->count--;
PrintStack(*L);
return OK;
}
//9、打印栈中所有元素
Status PrintStack(LinkStack L)
{
if(L.count==0){
printf("栈空,请压栈后再操作.\n");
return ERROR;
}
printf("栈为:");
while(L.top){
printf("%d ",L.top->data);
L.top=L.top->next;
}
return OK;
}
int main()
{
LinkStack L;
printf("请继续操作...\n");
while(1){
int input;
int value;
printf("\n==========================\n");
printf("1、初始化链栈.\n");
printf("2、销毁栈.\n");
printf("3、清空栈.\n");
printf("4、检查栈是否为空.\n");
printf("5、返回栈的长度.\n");
printf("6、返回栈顶元素.\n");
printf("7、压栈.\n");
printf("8、弹栈.\n");
printf("9、打印栈中所有元素.\n");
printf("\n==========================\n");
printf("请输入对应操作的序号:");
scanf("%d",&input);
switch(input){
case 1:
InitStack(&L);
break;
case 2:
DestoryStack(&L);
break;
case 3:
ClearStack(&L);
break;
case 4:
StackIsEmpty(L);
break;
case 5:
StackLength(L);
break;
case 6:
GetTop(L);
break;
case 7:
printf("请输入需要压入的元素:");
scanf("%d",&value);
Push(&L,value);
break;
case 8:
Pop(&L);
break;
case 9:
PrintStack(L);
break;
}
}
return 0;
}
运行截图
🚀先看后赞,养成习惯!🚀
🚀 先看后赞,养成习惯!🚀
🎈觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!🎈