笔记--堆栈

本文详细介绍了堆栈这一数据结构,包括其后进先出的特性。首先阐述了栈的顺序存储实现,涉及顺序栈的定义、创建、判断空满以及进栈出栈的操作。接着讨论了栈的链式存储实现,通过单链表结构定义链栈,创建链栈,检查链栈是否为空,并解释链栈不需要判断已满的原因。
摘要由CSDN通过智能技术生成

堆栈是具有一定约束的线性表,只在一端即栈顶做插入和删除操作,具有后进先出的特点。比如放在桌上的一叠盘子,要从最上面的盘子(即后放上去的)开始取走。


栈的顺序存储实现

栈的顺序存储通常由一个一维数组和一个记录栈顶元素位置的变量组成。

1.定义顺序栈
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
#define MaxSize 100//储存数据的最大个数
typedef struct SNode* Stack;
struct SNode//定义顺序栈的结构
{
 ElemType data[MaxSize];//储存元素的数组
 int top;//记录栈顶元素位置
};
2.创建一个顺序栈
Stack CreateStack()//创建顺序栈
{
 Stack L;
 L = (Stack)malloc(sizeof(Stack));//给栈分配存储空间
 L->top = -1;
 return L;
}
3.判断顺序栈是否为空和已满
int IsEmpty(Stack L)//判断是否为空
{
 return(L->top == -1);
}
int IsFull(Stack L)//判断是否已满
{
 return(L->top == MaxSize - 1);
}
4.进栈和出栈
void Push(Stack L, ElemType e)//将元素e进栈
{
 if (IsFull(L))//当堆栈已满时插入失败
 {
  printf("堆栈已满\n");
  return;
 }
 else
 {
  L->data[++(L->top)] = e;
 }
}
int Pop(Stack L,ElemType &e)//将栈顶元素出栈且赋值给e
{
 if (IsEmpty(L))//当堆栈为空的时候出栈失败
 {
  printf("堆栈为空\n");
  return 0;
 }
 else
 {
  e = L->data[(L->top)--];
 }
}

栈的链式存储实现

栈的链式存储结构实际上就是一个单链表,叫做链栈,插入和删除操作只能在链栈的栈顶实现。

1.定义链栈
#include<stdio.h>
#include<stdlib.h>
typedef  int ElemType;
typedef struct SNode* Stack;
struct SNode//定义一个链栈
{
 ElemType Data;
 struct SNode* Next;//栈顶指针
};
2.创建链栈
Stack Createtack()//构建一个链栈的头结点
{
 Stack L;
 L = (Stack)malloc(sizeof(struct SNode));
 L->Next = NULL;
 return L;
}
3.判断链栈是否为空

因为是一个链表,所以不去判断是否已满的情况。

int IsEmpty(Stack L)//判断是否为空
{
 return(L->Next == NULL);
}
4.进栈和出栈
void Push(Stack L, ElemType e)//进栈
{
 struct SNode* s;
 s = (struct SNode*)malloc(sizeof(struct SNode));
 s->Data = e;
 s->Next = L->Next;
 L->Next = s;
}
int Pop(Stack L, ElemType& e)//出栈
{
 struct SNode* s;
 if (IsEmpty(L))
 {
  printf("堆栈空\n");
  return 0;
 }
 else
 {
  s=L->next;
  e = s->Data;
  L->Next = s->Next;
  free(s);
  return 1;
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值