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

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

相关推荐
IronMurphy5 小时前
【算法四十三】279. 完全平方数
算法
墨染天姬5 小时前
【AI】Hermes的GEPA算法
人工智能·算法
mount_myj5 小时前
长长久久【C语言】
c语言
papership6 小时前
【入门级-数据结构-3、特殊树:完全二叉树的数组表示法】
数据结构·算法·链表
smj2302_796826526 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
山甫aa6 小时前
差分数组 ----- 从零开始的数据结构
数据结构
早日退休!!!6 小时前
《数据结构选型指南》笔记
数据结构·数据库·oracle
Beginner x_u7 小时前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
丑八怪大丑7 小时前
Java数据结构与集合源码
数据结构
Legendary_0089 小时前
LDR6500:USB‑C DRP PD协议芯片技术详解与应用实践
c语言·开发语言