详解C语言之堆栈

编辑: admin 分类: c#语言 发布时间: 2021-12-12 来源:互联网
目录
  • 一、何为堆栈?
  • 二、思维导图
  • 三、代码
    • 1、顺序堆栈
    • 2、链式堆栈
  • 总结

    一、何为堆栈?

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

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

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

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

    堆栈

    二、思维导图

    堆栈

    三、代码

    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;
    }
    

    总结

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

    【本文由:专业的印度服务器 提供,感谢支持】