欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解C语言之堆栈

程序员文章站 2022-07-03 22:49:42
目录一、何为堆栈?二、思维导图三、代码1、顺序堆栈2、链式堆栈总结一、何为堆栈?a.堆栈是一种特殊的线性表b.堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其不同点是:线性表允许在任意位置插...

一、何为堆栈?

a.堆栈是一种特殊的线性表

b.堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其不同点是:线性表允许在任意位置插入和删除数据元素,但堆栈只允许在固定一端进行插入和删除数据元素,所以栈又称为“先进后出”(filo)或“后进先出”(lifo)的线性表

c.堆栈中允许进行插入和删除数据元素的一端称为栈顶,另一端称为栈底

d.堆栈的插入操作通常称为进栈或入栈;堆栈的删除操作通常称为出栈或退栈

详解C语言之堆栈

二、思维导图

详解C语言之堆栈

三、代码

1、顺序堆栈

#include <stdio.h>
typedef int datatype;
#define maxstacksize 64
typedef struct
{
	datatype stack[maxstacksize];
	int top;
}seqstack;
//初始化
void stackinit(seqstack *s)
{
	s->top = 0;
}
//判断是否栈空
int stackisempty(seqstack s)
{
	if (s.top <= 0)
		return 0;
	else
		return 1;
}
//入栈
int stackpush(seqstack *s, datatype x)
{
	if (s->top >= maxstacksize)
	{
		printf("栈满,无法进栈!!!\n");
		return 0;
	}
	else
	{
		s->stack[s->top] = x;
		s->top++;
		return 1;
	}
}
//出栈
int stackpop(seqstack *s, datatype *x)
{
	if (s->top <= 0)
	{
		printf("堆栈已空,无法出栈!!!\n");
		return 0;
	}
	else
	{
		s->top--;
		*x = s->stack[s->top];
		return 1;
	}
}
//获取栈顶元素
int stackgettop(seqstack s, datatype *x)
{
	if (s.top <= 0)
	{
		printf("堆栈已空!!!\n");
			return 0;
	}
	else
	{
		*x = s.stack[s.top - 1];
		return 1;
	}
}
int main()
{
	seqstack mystack;
	int i, x;
	stackinit(&mystack);
	for (i = 0; i < 10; i++)
		stackpush(&mystack, i + 1);
	stackgettop(mystack, &x);
	printf("当前栈顶元素为:%d\n", x);
	printf("依次出栈:");
	while (stackisempty(mystack))
	{
		stackpop(&mystack, &x);
		printf("%d ", x);
	}
	system("pause");
	return 0;
}

2、链式堆栈

#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct snode
{
	datatype data;
	struct snode *next;
}lsnode;
//初始化
void stackinit(lsnode **top)
{
	*top = (lsnode *)malloc(sizeof(lsnode));
	(*top)->next = null;
}
//判断堆栈是否非空
int stackisempty(lsnode *top)
{
	if (top->next == null)
		return 0;
	else
		return 1;
}
//入栈
void stackpush(lsnode *top, datatype x)
{
	lsnode *p;
	p = (lsnode *)malloc(sizeof(lsnode));
	p->data = x;
	p->next = top->next;
	top->next = p;
}
//出栈
int stackpop(lsnode *top, datatype *x)
{
	lsnode *p = top->next;
	if (p == null)
	{
		printf("堆栈已空,删除错误!!!\n");
		return 0;
	}
	top->next = p->next;
	*x = p->data;
	free(p);
	return 1;
}
//获取栈顶元素
int stackgettop(lsnode *top, datatype *x)
{
	lsnode *p = top->next;
	if (p == null)
	{
		printf("堆栈已空,取出错误!!!\n");
		return 0;
	}
	*x = p->data;
	return 1;
}
//释放内存空间
void stackdestroy(lsnode **top)
{
	lsnode *p, *q;
	p = *top;
	while (p != null)
	{
		q = p;
		p = p->next;
		free(q);
	}
	*top = null;
}
int main()
{
	int i, x;
	lsnode *top;
	stackinit(&top);
	for (i = 0; i < 10; i++)
		stackpush(top, i + 1);
	stackgettop(top, &x);
	printf("当前栈顶元素为%d\n", x);
	printf("依次出栈:");
	while (stackisempty(top))
	{
		stackpop(top, &x);
		printf("%4d", x);
	}
	stackdestroy(&top);
	system("pause");
	return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!