C语言:基于链表实现栈

定义:

++栈(stack)++ 是一种遵循先入后出逻辑的线性数据结构。

把栈顶部称为"栈顶",底部称为"栈底"。将把元素添加到栈顶的操作叫作"入栈",删除栈顶元素的操作叫作"出栈"。

分析:

栈的常用操作有:

  1. 入栈;

  2. 出栈;

  3. 获取栈顶元素;

  4. 获取栈大小;

  5. 删除栈。

下面,采用链表结构实现栈:

代码:

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//链表
typedef struct ListNode 
{
	int data;
	ListNode *next;
};

//基于链表实现的栈
typedef struct StackNode
{
	ListNode *top;
	int size;
}LinkListStack;

//栈初始化(构造函数)
LinkListStack *creatLinkListStack()
{
	LinkListStack *s = (LinkListStack *) malloc(sizeof(LinkListStack));
	s->top = NULL;
	s->size = 0;
	return s;
}

//析构函数,删除栈
void delLinkedListStack(LinkListStack *s)
{
	while(s->top){
		ListNode *n = s->top->next;
		free(s->top);
		s->top = n;
	}
	free(s);
	printf("栈已删除\n");
}

//获取栈的长度
int getSize(LinkListStack *s)
{
	return s->size;
}

//判断栈是否为空
bool isEmpty(LinkListStack *s)
{
	return getSize(s)==0;
}

//入栈
void push(LinkListStack *s,int num)
{
	ListNode *node = (ListNode *)malloc(sizeof(ListNode));
	node->next = s->top;
	node->data = num;
	s->top = node;
	s->size++;
}

//访问栈顶元素
int gettop(LinkListStack *s)
{
	if(s->size == 0)
	{
		printf("栈为空\n");
		return INT_MAX;
	}
	return s->top->data;
}

//出栈
int pop(LinkListStack *s)
{
	int e = gettop(s);

	ListNode *temp = s->top;
	s->top=s->top->next;

	free(temp);
	temp=NULL;

	s->size--;
	return e;
}

//打印栈
void Print_Stack(LinkListStack *s)
{
	if(s==NULL)
	{
		printf("栈已删除\n");
		return ;
	}
	else
	{
		ListNode *p = s->top;
		printf("\n栈中元素为:\n");
		while(p)
		{
			printf("\t%d\n",p->data);
			p=p->next;
		}
		printf("****************\n");
	}
}

int main(){
	LinkListStack *Stack = creatLinkListStack();
	int num;
	char op[10];
	while(scanf("%s",op)!=EOF)
	{
		//入栈测试
		if(strcmp(op,"push")==0)
		{
			scanf("%d",&num);
			push(Stack,num);
		}
		//出栈测试
		else if(strcmp(op,"pop")==0)
		{
			num=pop(Stack);
		}
		//打印栈
		else if(strcmp(op,"show")==0)
		{
			Print_Stack(Stack);
		}
		//删除栈
		else if(strcmp(op,"delete")==0)
		{
			delLinkedListStack(Stack);
		}
		//获取栈顶元素
		else if(strcmp(op,"top")==0)
		{
			num = gettop(Stack);
			printf("%d\n",num);
			printf("****************\n");
		}
	}
	return 0;
}

测试:

输入:

push 1

push 4

push 3

push 5

show

pop

show

pop

show

top

delete

输出:

栈中元素为:

5

3

4

1

****************

栈中元素为:

3

4

1

****************

栈中元素为:

4

1

****************

4

****************
栈已删除

相关推荐
雾里看山15 分钟前
顺序表VS单链表VS带头双向循环链表
数据结构·链表
学不动CV了2 小时前
ARM单片机启动流程(二)(详细解析)
c语言·arm开发·stm32·单片机·51单片机
大千AI助手2 小时前
DTW模版匹配:弹性对齐的时间序列相似度度量算法
人工智能·算法·机器学习·数据挖掘·模版匹配·dtw模版匹配
好好研究3 小时前
学习栈和队列的插入和删除操作
数据结构·学习
YuTaoShao4 小时前
【LeetCode 热题 100】48. 旋转图像——转置+水平翻转
java·算法·leetcode·职场和发展
生态遥感监测笔记4 小时前
GEE利用已有土地利用数据选取样本点并进行分类
人工智能·算法·机器学习·分类·数据挖掘
猫猫的小茶馆4 小时前
【STM32】通用定时器基本原理
c语言·stm32·单片机·嵌入式硬件·mcu·51单片机
Tony沈哲4 小时前
macOS 上为 Compose Desktop 构建跨架构图像处理 dylib:OpenCV + libraw + libheif 实践指南
opencv·算法
刘海东刘海东5 小时前
结构型智能科技的关键可行性——信息型智能向结构型智能的转变(修改提纲)
人工智能·算法·机器学习