数据结构-栈

1.栈的定义

栈只能从表的一端存取数据,另一端是封闭的,如图所示;在栈中,无论是存数据还是取数据,都必须遵循"先进后出"的原则,即最先进栈的元素最后出栈。拿下图的栈来说,1是最先进的栈。因此,当需要从栈中取出1 时,根据"先进后出"的原则,需提前将3和2从栈中取出,然后才能成功取出1。
图1
栈的头端被称为栈顶;封口端被称为栈底

2.栈的类型

  • 顺序栈:采用顺序存储结构可以模拟栈存储数据实现栈存储结构,底层为数组
  • 链式栈:采用链式存储结构可以模拟栈存储数据实现栈存储结构,底层为链表

3.算法

在实际应用中,通常只会对栈执行以下两种操作:

  • 入栈:向栈中添加元素
  • 出栈:从栈中提取出指定元素

4.顺序栈代码描述

代码基本简单

#include <stdio.h>
int push(int* a,int top,int elem){
    a[++top]=elem;
    return top;
}
int pop(int * a,int top){
    if (top==-1) {
        printf("空栈");
        return -1;
    }
    printf("弹栈元素:%d\n",a[top]);
    top--;
    return top;
}
int main() {
    int a[100];
    int top=-1;
    top=push(a, top, 1);
    top=push(a, top, 2);
    top=push(a, top, 3);
    top=push(a, top, 4);
    top=pop(a, top);
    top=pop(a, top);
    top=pop(a, top);
    top=pop(a, top);
    top=pop(a, top);
    return 0;
}

5.链式栈代码描述

  • 入栈:头插法向链表中插入元素,例如将元素1,2,3,4依次入栈
    image
  • 出栈:删除链表首元结点,先进后出
    image
    完整代码为:
#include <stdio.h>
#include <stdlib.h>
typedef struct stack
{
	int iVal;
	struct stack* ptNext;
}T_Stack,*PT_Stack;

//画图
PT_Stack push(PT_Stack ptStack, int iVal)
{
	//分配新结点
	PT_Stack ptNewNode = (PT_Stack)malloc(sizeof(T_Stack));
	ptNewNode->iVal = iVal;
	//头指针和新结点建立联系
	ptNewNode->ptNext = ptStack;
	/*更新头指针的位置*/
	ptStack = ptNewNode;
	return ptStack;
}
PT_Stack pop(PT_Stack ptStack)
{
	if (ptStack)
	{
		PT_Stack ptDelNode = ptStack;
		ptStack = ptStack->ptNext;
		printf("出栈元素为%d\n", ptDelNode->iVal);
		if (ptStack)
		{
			printf("新栈顶元素%d\n", ptStack->iVal);
		}
		else
		{
			printf("栈已空\n");
		}
		free(ptDelNode);
	}
	else
	{
		printf("栈已空");
	}
	return ptStack;
}

int main()
{
	//头指针指向首元结点
	PT_Stack ptStack = NULL;
	/*入栈操作*/
	ptStack = push(ptStack, 1);
	ptStack = push(ptStack, 2);
	ptStack = push(ptStack, 3);
	ptStack = push(ptStack, 4);
	/*出栈操作*/
	ptStack = pop(ptStack);
	ptStack = pop(ptStack);
	ptStack = pop(ptStack);
	ptStack = pop(ptStack);
	return 0;
}

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值