顺序栈的实现

传统的顺序表可以实现从随机存取,但栈是一个只允许从一头输入一头输出的受限制的线性表。n个不同的元素有n+1分之1乘以Cn2n个可能性。


由于顺序栈十分简单,不再通过复杂的方式去解释,采用顺序存储的栈称为顺序栈,它利用一组连续的存储单元存放自栈底到栈顶的数据元素,并且附设了一个指针(top)指向当前栈顶的元素位置。

栈顶指针S.top,初始时设置为S.top=-1。栈顶元素:S.data[S.top]。

进栈操作:栈不满时,栈顶指针先加1,再送值到栈顶元素。若是S.top==0的话就先送入数据再加1。

出栈操作:栈非空时,先取栈顶元素,再讲栈顶指针减1。若是S.top==0的话则先栈顶指针减1然后再减1。

栈空条件S.top==-1或者S.top==0。栈满条件:S.top==Maxsize-1或者S.top==Maxsize,栈长:S.top+1或者S.top。

#include<stdio.h>
#include<stdlib.h>
#define maxsize 10
#define initsize 10
#pragma warning(disable:4996)
#pragma warning(disable:5208)

//顺序栈的定义
typedef struct 
{
    int data[maxsize] = {0};
    int top;//定义一个指向栈顶的指针
}SqStack;

//顺序栈的初始化
int InitStack(SqStack& S) //将顺序栈地址传入
{
    S.top = -1;//先指向栈底
    return 1;
}

//顺序栈的判空
int StackEmpty(SqStack S)
{
    if (S.top == -1)return  1;
    return 0;
}

//顺序栈的判满
int StackFull(SqStack S) 
{
    if (S.top == maxsize - 1)return 1;
    return 0;
}

//顺序栈的求长
int StackLength(SqStack S) 
{
    return S.top + 1;

}

//顺序栈入栈
int PushStack(SqStack& S,int e) 
{
    if (S.top == maxsize - 1)return 0;//说明栈满
    S.data[++S.top] = e;
    return 1;
}

//顺序栈出栈
int PopStack(SqStack&S,int &e)
{
    if (S.top == -1)return 0;//说明栈空
    e = S.data[S.top--];
    return 1;
}

//读取顺序栈栈顶元素
int GetTop(SqStack S,int &e)
{
    if (S.top == -1)return 0;//说明栈空无法返回数值
    e = S.data[S.top];
    return 1;
}

void main()
{
    SqStack S;
    int i, e;
    InitStack(S);
    printf("栈顶是%d\n", S.top);
    printf("顺序栈的入栈:\n");
    e = StackEmpty(S);
    printf("此时的栈是否空:%d\n",e);
    for(i=1;i<=maxsize;i++)
    {
        PushStack(S, i);
    }
    e=StackFull(S);
    printf("此时栈是否满:%d\n",e);
    printf("出栈数据为:");
    for (i = 1; i < 5; i++) 
    {
        PopStack(S, e);
        printf("%d ", e);
    }
    printf("\n");
    e = StackLength(S);
    printf("此时的栈长为:%d\n", e);
    e = GetTop(S, i);
    printf("此时的栈头元素是:%d\n", i);
}

经测试,能够实现简单的操作,考研仅供自己复习,还希望大家多多批评交流。顺序栈是简化的顺序表因为不算男一看就懂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值