数据结构期末复习——栈

1.栈的定义

一端固定,只允许在另一端插入和删除的线性表,又称堆栈

特殊在操作:操作受限制!

特性:先进后出(first in last out)FILO

            后进先出(last in first out)LIFO

1.1基本图示

2.顺序存储结构

2.1定义&初始化

一个stack需要包含:

1)data数组

2)栈顶指针top(说是指针,其实就是栈顶元素在的位置是在数组的第0个还是第1个还是第2个位置)

3)最大范围maxsize

初始化函数:就返回初始化好的栈就可以了

注意top=-1

上面提到的3个元素都要初始化哦~

#include <stdio.h>
#include <stdlib.h>
//1.基于顺序存储结构的实现
#define maxsize 10
struct node
{
    int * data;
    int top;
    int maxsize;
};
typedef struct node * stack;

stack createStack(int maxsize)
{
    //申请获得栈空间
    stack s=(stack)malloc(sizeof(struct node));
    s->data=(int*)malloc(sizeof(int)*maxsize);
    s->top=-1;
    s->maxsize=maxsize;
    //返回这个栈
    return s;
}    

2.2判断栈满

//判断是否栈满
int isFull(stack s)
{
    return (s->top==s->maxsize-1)
}

2.3判断栈空

int isEmpty(stack s)
{
    return s->top==-1;
}

2.4入栈

//返回值是int,只是为了标明是否压栈成功,0就是失败,1就是成功
int push(stack s,int x)
{
    if(isFull(s)){
        printf("栈满");
        return 0;
    }
    else{
        s->data[++(s->top)]=x;//这里你必须先让top++,因为初始化是-1
        return 1;
    }
}

2.5出栈

要返回的就是栈顶元素,也就是取出来栈顶元素!

出栈函数的返回值是int,因为存储元素的类型就是int,


int pop(stack s)
{
    if(isEmpty(s)){
        printf("栈空");
        return 0;
    }
    else{
        return s->data[(s->top)--]//top指向的元素就是栈顶的元素,所以先返回,再让top--
    }
}

3.溢出处理-两个栈共享一个数组空间

两个栈共享一个数组空间

3.1定义&初始化

//2.两个栈:共享一个数组空间
struct snode
{
    char * data;
    int top1;//堆栈1的栈顶指示器
    int top2;//堆栈2的栈顶指示器
    int maxsize;
};
typedef struct snode* stack;
//初始化
stack createStack(int maxsize)
{
    stack s;
    //申请栈空间
    s=(stack)malloc(sizeof(struct snode));
    s->data=(char*)malloc(maxsize*sizeof(char));
    s->top1=-1;         //栈1置为空
    s->top2=maxsize;    //栈2置为空
    s->maxsize=maxsize;
}

3.2入栈&出栈

//入栈
int push(stack s,char x,int tag)
{
    //tag就是区分两个堆栈的标志,tag==1,就是第一个堆栈进行操作
    if(s->top2-s->top1==1){
        printf("堆栈满\n");
        return 0;
    }
    else{
        if(tag==1)
            s->data[++(s->top1)]=x;
        else
            s->data[--(s->top2)]=x;
        return 1;
    }
}

char pop(stack s,int tag)
{
    if(tag==1){
        if(s->top1==-1){
            printf("堆栈1空\n");
            return false;
        }
        else
            return s->data[(s->top1)--];
    }
    else{
        if(s->top2==s->maxsize){
            printf("堆栈2空\n");
            return false;
        }
        else
            return s->data[(s->top2)++];
    }
}

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.别止步春天.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值