用链表实现栈(c语言)

概念篇

如果你提前学过链表的相关知识和代码,那么学习这篇文章你会轻松很多。感兴趣的朋友可以看下这篇文章顺序表——链表(c语言)
如果你还想了解下用顺序表写栈的知识可以看下这篇文章用顺序表写栈(c语言)
在这里插入图片描述
栈是一种特殊的线性表,特殊于它先进后出的特征,而这个特征可以通过链表的方式实现。
如果你使用的是双链表,就可以实现一个双向栈

图示

在这里插入图片描述

代码篇

1.栈的生成

用结构体把一些属性封装起来表示栈
typedef struct node
{
	int data;
	struct node*next;
}node;
typedef struct stack
{
	node*head;
	//头指针
	int size;
}stack;

2.栈的创建

初始化栈,大小为零,头指针为空。
void stack_creat(stack*stk)
{
	stk->size=0;
	stk->head=NULL;
}

3.栈的销毁

释放栈的内存空间,跟链表的销毁相似。
void stack_destroy(stack*stk)
{
	while(stk->head)//遍历所有元素
	{
		node*newnode=stk->head;
		//定义一个指针初始化为指向第一个结点
		free(newnode);
		//释放第一个结点的内存空间
		stk->head=stk->head->next;
		//更新头指针
	}
}

4.入栈

入栈相当于把元素插在链表的最前面
void stack_push(stack*stk,int elements)
{
	node*newnode=(node*)malloc(sizeof(node));
	newnode->data=elements;
	newnode->next=stk->head;
	stk->head=newnode;
	stk->size++;
}

5.出栈

相当于删除链表的第一个结点,并返回此结点的data成员
int stack_pop(stack*stk)
{
	if(stk->size==0)
    {
        printf("stk underflow!");
        exit(1);
    }
	node*newnode=stk->head;
	int result=newnode->data;//保存栈的第一个元素
	free(newnode);
	stk->head=stk->head->next;
	stk->size--;
	return result;//返回元素
}

6.栈顶元素

相当于返回链表的第一个结点的data成员
int stack_top(stack*stk)
{
    if(stk->size==0)
    {
        printf("stk is empty");
        exit(1);
    }
    return stk->head->data;
}

7.栈的大小

int stack_size(stack*stk)
{
	return stk->size;
}

8.完整代码

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
	int data;
	struct node*next;
}node;
typedef struct stack
{
	node*head;
	//头指针
	int size;
}stack;
void stack_creat(stack*stk)
{
	stk->size=0;
	stk->head=NULL;
}
void stack_destroy(stack*stk)
{
	while(stk->head)//遍历所有元素
	{
		node*newnode=stk->head;
		//定义一个指针初始化为指向第一个结点
		free(newnode);
		//释放第一个结点的内存空间
		stk->head=stk->head->next;
		//更新头指针
	}
}
void stack_push(stack*stk,int elements)
{
	node*newnode=(node*)malloc(sizeof(node));
	newnode->data=elements;
	newnode->next=stk->head;
	stk->head=newnode;
	stk->size++;
}
int stack_pop(stack*stk)
{
	if(stk->size==0)
    {
        printf("stk underflow!");
        exit(1);
    }
	node*newnode=stk->head;
	int result=newnode->data;//保存栈的第一个元素
	free(newnode);
	stk->head=stk->head->next;
	stk->size--;
	return result;//返回元素
}
int stack_top(stack*stk)
{
    if(stk->size==0)
    {
        printf("stk is empty");
        exit(1);
    }
    return stk->head->data;
}
int stack_size(stack*stk)
{
	return stk->size;
}
int main()
{
	stack*stk;
    stack_creat(&stk);
    stack_push(&stk,10);
    stack_push(&stk,20);
    stack_push(&stk,30);
    printf("stacktop is:%d\n",stack_top(&stk));
    printf("stackpop is:%d\n",stack_pop(&stk));
    printf("stk size is:%d",stack_size(&stk));
    stack_destroy(&stk);
    return 0;
     /*入栈:10 20 30
    	stacktop:30
    	第一个出栈的是30
    */
}

运行结果

在这里插入图片描述
希望您能有所启发,望路过的大佬能进行指正和补充
在下篇的文章我将会说一些我对队列的见解

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是链表实现C语言代码: ```c #include <stdio.h> #include <stdlib.h> // 定义链表结点 typedef struct Node{ int data; struct Node* next; } Node; // 定义结构体 typedef struct Stack{ Node* top; int size; } Stack; // 初始化 void initStack(Stack* s){ s->top = NULL; s->size = 0; } // 判断是否为空 int isEmpty(Stack* s){ return s->size == 0; } // 入操作 void push(Stack* s, int data){ Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = s->top; s->top = newNode; s->size++; } // 出操作 int pop(Stack* s){ if(isEmpty(s)){ printf("为空,无法出"); return -1; } int data = s->top->data; Node* temp = s->top; s->top = s->top->next; free(temp); s->size--; return data; } // 获取顶元素 int peek(Stack* s){ if(isEmpty(s)){ printf("为空,无法获取顶元素"); return -1; } return s->top->data; } int main(){ Stack s; initStack(&s); push(&s, 1); push(&s, 2); push(&s, 3); printf("顶元素为:%d\n", peek(&s)); printf("出元素为:%d\n", pop(&s)); printf("出元素为:%d\n", pop(&s)); printf("出元素为:%d\n", pop(&s)); printf("是否为空:%d\n", isEmpty(&s)); return 0; } ``` 在上面的代码中,我们使用了链表实现。在的初始化函数中,我们将顶指针置为 NULL,并将的大小设为 0。在入操作时,我们创建一个新的链表结点,将其插入到链表的头部,并将顶指针指向该结点。在出操作时,我们首先判断是否为空,如果为空则输出错误信息;否则,我们取出顶元素,并将顶指针指向下一个结点。在获取顶元素时,我们同样需要判断是否为空。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值