数据结构之栈

栈(stack)又称堆栈,是一种特殊的线性结构,栈的特殊之处在于:所有对于栈的操作都是在栈的一端(顶部)进行的,如对栈进行元素添加(入栈)元素删除(弹栈/出栈),按照“后进先出”的规则进行操作。栈在程序设计中特别重要,程序的调试和运行都需要栈的支撑。

一 栈的定义和基本操作

栈(stack)是限定在表的一端进行插入和删除操作的线性表。插入元素称为(入栈),删除元素称为出栈。通常将允许出栈的一端称为栈顶(top),则另一端称为栈底(bottom)。不含元素的栈称为空栈。

举个例子来说明栈的结构和操作:将书放入没有盖的盒子中,这样要将书取出来,只能将最上层的书先取出来,即将最后放入的书先取出来。所以栈又称为后进先出的线性表,简称FILO(first in last out)

栈的基本操作如下
(1)初始化一个栈
(2)判断是否是空栈
(3)判断是否是满栈
(4)进栈
(5)出栈
(6)取栈顶元素
(7)求当前栈元素个数

二 栈的顺序存储结构和基本操作

因为栈是一种特殊的线性结构,所以有两种存储结构,即顺序存储机构和链式存储结构。接下来给出顺序存储机构的相关实现代码。
#include <stdio.h>
#include <stdlib.h>
#define Size 100
typedef struct
{
    int data[Size];
    int top;

} Stack;
顺序栈利用数组来实现 数组的大小定义为
Size 100
用top作为栈顶元素的的下标,top的范围为0到Size-1,通常规定top等于0的时候表示栈空,即数组data[0]不存放数据。
1.初始化一个栈
void init_stack(Stack *s)
{
    int i;
    s->top=0;
    printf("请输入栈的元素 以-1结束输入");
    scanf("%d",&i);
    while(is_full(s)!=1&&i!=-1)
    {
        s->data[++s->top]=i;
        scanf("%d",&i);
    }
}
从键盘输入栈的元素,假定当输入为-1时作为输入结束的标志
2.判断一个栈是否为空 
通过判断top是否为0来判断栈是否为空
int is_empty(Stack *s)
{
    if (s->top==0)
        return 1;
    else
        return 0;
}
3.判断一个栈是否已满
通过判断top是否为Size-1来判断栈是否已经满了
int is_full(Stack *s)
{
    if (s->top==(Size-1))
        return 1;
    else
        return 0;
}
4.数据进栈操作
void push_stack(Stack *s,int i)
{
    if(is_full(s))
        printf("栈已满 入栈失败");
    else
    {
        s->data[++s->top]=i;
    }
}
5.数据出栈操作
void pop_stack(Stack *s)
{
    if(is_empty(s))
        printf("栈已空 出栈失败");
    else
    {
        return s->data[s->top--];
    }
}
6.取栈顶元素操作
int get_top(Stack *s)
{
    if(is_empty(s))
        printf("栈已空 取元素失败");
    else
    {
        printf("%d\n",s->data[s->top]);
        return s->data[s->top];
    }
}
7.栈置空操作
void clean_stack(Stack *s)
{
    s->top=0;
}
8.求当前栈中元素的个数
int current_size(Stack *s)
{
    printf("栈内有%d个元素\n",s->top);
    return s->top;
}

三 栈的链式存储结构及其相关操作

typedef struct snode
{
   int data;
   struct snode *next;
}LinkStack;


1.初始化一个栈
LinkStack* init_linkstack()
{
    int i;
    LinkStack *top=NULL;
    LinkStack *p;
    printf("请输入栈的元素或者以-1结束");
    scanf("%d",&i);
    while(i!=-1)
    {
        p=(LinkStack*)malloc(sizeof(LinkStack));
        p->data=i;
        p->next=top;
        top=p;
        scanf("%d",&i);
    }
    return top;
}

2.数据进栈操作
LinkStack*  push_linkstack(LinkStack *top,int x)
{
    LinkStack *p;
    p=(LinkStack*)malloc(sizeof(LinkStack));
    p->data=x;
    p->next=top;
    top=p;
    return top;

}
3.数据出栈操作
LinkStack* pop_linkstack(LinkStack *top)
{
  LinkStack *p;
  p=top;
  top=top->next;
  free(p);
  return top;
}
4.输出栈中所有元素
void print_linkstack(LinkStack *top)
{
    LinkStack *p=top;
    while(p!=NULL)
    {
        printf("%d\n",p->data);
        p=p->next;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值