张小五学算法与数据结构第五天:顺序栈

一、栈的定义和特点
栈是限制在一端进行插入操作和删除操作的线性表,允许进行操作的一端称之为“栈顶”,另一端固定称为“栈底”,当栈中没有元素时称为“空栈”。
根据它的特性我们得知,栈的特点是“后进先出”(LIFO)。
由于栈也是线性逻辑结构,因此线性表的存储结构对栈也适用,通常栈有顺序栈和链栈两种存储结构,这两种存储结构的不同,使得实现栈的基本运算的算法也有所不同。
二、顺序栈的概述运算及特点
顺序栈它是线性逻辑结构顺序存储的一种,具有和顺序表同样的存储结构,由数组定义,配合用数组下标表示栈顶指针top完成各种操作。下面我直接将顺序栈的概述运算用代码的方式展现出来。
seqstack.h:
/*
作者:张小五
时间:2018年1月29日
*/
#ifndef SEQSTACK_H_
#define SEQSTACK_H_

#define maxsize 64 //栈的容量
#define TRUE 1
#define FALSE 0
typedef struct{
        int data[maxsize]; //用数组作为栈的存储空间
        int top; //指示栈顶的位置
}seqStack,*seqStackP; //顺序栈的类型定义以及定义指向顺序镇的指针

void CreateStack(seqStackP S); //建栈
void SetStack(seqStackP S);//置空栈
int IsEmpty(seqStackP S);//判空栈
seqStackP PushStack(seqStackP S,int x);//元素进栈
int GetStack(seqStackP S);//取栈顶元素
int ShowStack(seqStackP S);//去栈顶元素
void PopStack(seqStackP S);//元素出栈

#endif // SEQSTACK_H_
seqstack.c:
/*
作者:张小五
时间:2018年1月29日
*/
#include "seqstack.h"
#include "stdio.h"

//建栈
void CreateStack(seqStackP S){
    S->top = -1;
    int i = 1;
    int data;
    do{
        printf("请输入第%d个元素:",i);
        scanf("%d",&data);
        if(data!=-1){
        S->top++;
        S->data[S->top] = data;
        }
        i++;
    }while(i<maxsize&&data!=-1);
}
//置空栈
void SetStack(seqStackP S){
    S->top = -1;
}

//判空栈
int IsEmpty(seqStackP S){
    return ((S->top>=0)?FALSE:TRUE);
}
//元素进栈
seqStackP PushStack(seqStackP S,int x){
    if(S->top == maxsize -1){
        printf("栈溢出!\n");
        return NULL;
    }
    S->top ++;
    S->data[S->top] = x;
    return S;
}
//取栈顶元素
int GetStack(seqStackP S){
    if(IsEmpty(S)){
        printf("栈元素为空!\n");
        return NULL;
    }
    return S->data[S->top];
}
//去栈顶元素
int ShowStack(seqStackP S){
     if(IsEmpty(S)){
        printf("栈元素为空!\n");
        return NULL;
    }
    return S->data[S->top--];
}
//元素出栈
void PopStack(seqStackP S){
    if(IsEmpty(S)){
        printf("栈元素为空!\n");

    }else
    printf("出栈元素为:\n");
    while(S->top>=0){
        printf("%d ",S->data[S->top]);
        S->top--;
    }
    }
main.c:
/*
作者:张小五
时间:2018年1月29日
*/
#include "seqstack.h"
#include "stdio.h"
#include "seqstack.c"

int main(int args,char *argv[]){
    //建栈
    seqStackP S = (seqStackP)malloc(sizeof(seqStack));
    CreateStack(S);

    //出栈
    PopStack(S);
    return 0;
}
运行结果截图:

综上所述,顺序栈的特点是,由于栈的插入和删除操作存在它的特殊性,所以用顺序存储结构表示的栈并不存在插入删除数据元素是需要移动的问题,但栈容量难以扩充的弱点仍旧没有摆脱。
在顺序栈中有“上溢”和“下溢”的概念。顺序栈好比一个盒子,我们在里头放了一叠书,当我们要用书的时候只能从第一本开始拿,那当我们把书本放到这个栈中超过盒子的顶部时就已经放不下了,这是就是“上溢”,“上溢”也就是栈顶指针指向了栈的外面,显然是出错了。反之,当栈中已经没有书时,我们再去拿,发现没有数了,这就是“下溢”,“下溢”本身可以表示栈为空栈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

张小五丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值