栈的顺序存储结构实现(四)

18.11.17

什么是栈

栈是一种只限定在表尾进行插入和删除的线性表,这里的表尾指的是栈顶,而不是栈尾,所以栈又被称为先进后出的线性表,也就是说栈是一个类似于木桶之类存在,先放进去的后拿出来

我们通常用一个变量top来标志栈顶元素的变化,若栈的长度为StackSize,那么top的值就必须小于StackSize,例如,当栈中只有一个元素时,top等于0,当栈中没有元素时,即栈为空栈,top等于-1

顺序存储结构离不开数组

既然是顺序存储结构实现栈,自然少不了数组出席,这可比链式简单多了,先定义个栈的结构,其形式跟线性表的顺序存储结构真的很像,非常非常像,线性表里边是有一个数组加一个整型变量存长度,而顺序栈里边是一个数组加一个整型变量top存栈尾的位置,代码如下

结构定义

typedef struct{
    SElemType data[MaxSize];//存数据的数组
    int top;//标记变量,记录表尾的变化
}SqStack;//将栈的类型命名为SqStack

栈初始化

跟顺序存储实现的线性表很像,它是使线性表的长度length等于0,而在栈这边,是使top等于-1(栈空时top==-1)

void CreateStack(SqStack *S){
    if(!S)
        printf("内存分配失败");
    S->top=-1;
}

入栈(压栈)函数

在栈还不是满的情况下,每进一个元素,top加一

int Push(SqStack *S,SElemType e){//压栈函数,先进去的元素在数组里边,也就是数组前端
    if(S->top==MaxSize-1)//如果栈满了
        return 0;
    S->top++;
    S->data[S->top]=e;
    return 1;
}

出栈函数

有进就得有出,出栈函数要求我们将弹出的元素保存下来,在栈不空的情况下,将弹出元素赋给一个指针,然后top减1

int Pop(SqStack *S,SElemType *e){//出栈,成功返回1,失败返回0
    if(S->top==-1){//判断栈是否为空
        printf("栈已空");
        return 0;
    }
    *e=S->data[S->top];
    S->top--;
    return 1;
}

注意
以上的入栈和出栈函数均未涉及任何循环
所以时间复杂度为O(1)

打印函数

我们不知道栈里面的情况折腾的怎么样了,需要一个打印函数来查看,很简单,将栈中的数组打印出来就好了

int PrintStack(SqStack S){//打印函数
    int i;
    for(i=0;i<S.top+1;i++){//遍历数组,逐个打印
        printf("%d  ",S.data[i]);
    }
    printf("\n");
    return 1;
}

这样栈的一些基本操作就完成了,我们把它组合到一个程序里面试试

源程序调试

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 20

typedef int SElemType;//令int 是SElemType

//对栈结构进行定义
typedef struct{
    SElemType data[MaxSize];
    int top;//标记变量,记录表尾的变化
}SqStack;

//函数声明
void CreateStack(SqStack *S);
int Push(SqStack *S,SElemType e);
int Pop(SqStack *S,SElemType *e);
int PrintStack(SqStack S);

int main(){//主函数调试
    SqStack S;
    int i,elem;
    CreateStack(&S);
    for(i=0;i<10;i++){
        Push(&S,i);
    }
    printf("此时栈中元素为");
    PrintStack(S);
    for(i=0;i<11;i++){
        printf("弹出一个数,此时栈为:  ");
        Pop(&S,&elem);
        PrintStack(S);
    }
}


void CreateStack(SqStack *S){
    if(!S)
        printf("内存分配失败");
    S->top=-1;
}

int Push(SqStack *S,SElemType e){//压栈函数,先进去的元素在数组里边,也就是数组前端
    if(S->top==MaxSize-1)//如果栈满了
        return 0;
    S->top++;
    S->data[S->top]=e;
    return 1;
}

int Pop(SqStack *S,SElemType *e){
    if(S->top==-1){
        printf("栈已空");
        return 0;
    }
    *e=S->data[S->top];
    S->top--;
    return 1;
}


int PrintStack(SqStack S){
    int i;
    for(i=0;i<S.top+1;i++){
        printf("%d  ",S.data[i]);
    }
    printf("\n");
    return 1;
}

调试结果如下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值