C语言之堆栈

C语言之堆栈,第1张

C语言之堆栈

C语言之堆栈
  • 一、何为堆栈?
  • 二、思维导图
  • 三、代码
    • 1、顺序堆栈
    • 2、链式堆栈

一、何为堆栈?

    a.堆栈是一种特殊的线性表
    b.堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其不同点是:线性表允许在任意位置插入和删除数据元素,但堆栈只允许在固定一端进行插入和删除数据元素,所以栈又称为“先进后出”(FILO)或“后进先出”(LIFO)的线性表
    c.堆栈中允许进行插入和删除数据元素的一端称为栈顶,另一端称为栈底
    d.堆栈的插入 *** 作通常称为进栈或入栈;堆栈的删除 *** 作通常称为出栈或退栈

二、思维导图

三、代码 1、顺序堆栈
#include 

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("当前栈顶元素为:%dn", x);
	printf("依次出栈:");
	while (StackIsEmpty(myStack))
	{
		StackPop(&myStack, &x);
		printf("%d ", x);
	}
	system("pause");
	return 0;
}
2、链式堆栈
#include 
#include 

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("当前栈顶元素为%dn", x);
	printf("依次出栈:");
	while (StackIsEmpty(top))
	{
		StackPop(top, &x);
		printf("%4d", x);
	}
	StackDestroy(&top);
	system("pause");
	return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5520643.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-13
下一篇2022-12-13

发表评论

登录后才能评论

评论列表(0条)

    保存