数据结构_栈

栈:具有一定操作约束的线性表

1、针对于元素:后进先出

2、针对于操作:只在栈的一端(栈顶top)进行插入、删除

栈的抽象数据类型 描述
数据对象集:

  • 具有0个或者多个元素的有穷线性表。

操作集:

  • 长度为MaxSize的栈s∈stack。_
  • 栈元素item∈ElemType
  • 创建空栈:
  • 判断栈空:empty()
  • 判断栈满:
  • 元素入栈:push()
  • 元素出栈:pop()
  • 弹出栈顶元素:top()
  • 返回栈中元素数:size()
#include <iostream>
#include <stack>   //标准库中的 stack
using namespace std;

int main()
{
	stack<int> sta;
	for (size_t i = 0; i < 10; i++)
	{
		sta.push(i);
	}

	cout << "栈顶元素为:" << sta.top() << endl;

	cout << "栈中元数数:" << sta.size() << endl;

	cout << "##### 弹出栈顶元素 #####" << endl;
	sta.pop();

	cout << "弹出栈顶元素后的元素个数:" << sta.size() << endl;

	cout << "##### 向栈顶添加元素 #####" << endl;
	sta.push(100);

	cout << "栈顶元素:" << sta.top()  << endl;
	cout << "加入元素后,栈中元素个数为:" << sta.size() << endl;

	system("pause");

	return 0;
}
  • 栈是一种线性表:故而可顺序存储或者链式存储
栈的顺序存储:底层数据结构为数组。
  • 一个一维数组
  • 一个记录栈顶位置的变量
    以数组为底层数据结构时,通常以数组头作为栈底。
  • 创建结点
//基于C语言
typedef struct SNode *stack

struct SNode
{
	ElementType Data[MaxSize];   //底层数组
	int top;   //标记栈顶位置。
}
  • 入栈
  //基于C语言
  //先判断栈中能否再放元素。
void push(stack PtrS,ElementType item)
{
	if(PtrS->top == MaxSize-1)
	{
		print("栈已满。")
		return ;
	}else{
		(Ptrs->top)++;   //先 数组下标增加
		PtrS->Data[PtrS->top] = item;   //再 放入元素
		//Ptr->Data[++(PtrS->top)] = item;  
		return ;
	}
  • 出栈
//基于C语言
// 先判断栈中有无元素?
ElementType pop(stack PtrS)
{
	if(PtrS->top == -1)
	{
		printf("栈中无元素,栈为空。")return 0;
	}else{
		return(PtrS->Data[(PtrS->top)--]);   //先弹出栈顶元素再下标减 1
	}
}
栈的链式存储:底层数据结构为单链表
  • 一个数据域
  • 一个指针域
    以单链表为底层数据结构时,在链的表头进行操作。
  • 创建结点
typedef SNode *stack;
struct SNode 
{
	ElementType val;   //数据域
	struct SNode *next;   //指针域,直接后继结点的存储位置
}
  • 建立空栈
stack createStack()
{
	stack sta;
	sta = (stack)malloc(sizeof(struct SNode));
	sta->next = NULL;
	return sta;
}
  • 判断是否为空栈
int empty(stack sta)
{
	return(sta->next == NULL);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值