数据结构:栈,ADT及顺序,用法

顺序栈基于数组的数据结构,故在定义栈的数据结构中,关键是top(栈顶的变化过程),值得注意的一点是top的取值是-1,以及malloc的用法。
下面是C语言用法

//顺序栈
#include<stdio.h>
#include<malloc.h>
#define stackSize 10

//栈的数据结构(用数组实现)
typedef struct
{
    int top;
    int size;
    int data[stackSize];
}stack,*sqStack;

//建立新栈
sqStack Create()
{
    sqStack S=(stack *)malloc(stackSize * sizeof(stack));
    S->size = stackSize;
    S->top = -1;
    printf("成功建立一个长度为%d的栈\n",stackSize);
    return S;
}

//判断栈空满并返回栈中元素个数
int IsFull(sqStack S)
{
    if (S->top == -1)
    {
        printf("栈已空\n");
        return false;
    }
    else
    {
        if (S->top == (S->size - 1))
        {
            printf("栈已满\n");
            return true;
        }
        else
        {
            printf("栈中有%d个元素\n",S->top+1);
        }
    }
}

//入栈
int InStack(sqStack S,int P)
{
    if (S->top == (S->size - 1))
    {
        printf("栈已满,出栈后再执行操作\n");
    }
    else
    {
        printf("请输入入栈元素");
        scanf_s("%d", &P);
        S->top = S->top + 1;
        S->data[S->top] = P;
        printf("成功入栈,入栈元素为%d\n", S->data[S->top]);
        return P;
    }
};

//出栈
int OutStack(sqStack S)
{
    if (S->top == -1)
    {
        printf("栈已空,入栈后再执行操作\n");
    }
    else
    {
        printf("出栈成功,出栈元素为%d\n", S->data[S->top--]);
    }
    return S->top + 1; 
}

//查看栈顶元素
int VistStack(sqStack S)
{
    if (S->top == -1)
    {
        printf("栈已空,入栈后再执行操作\n");
    }
    else
    {
        printf("栈顶元素为%d", S->data[S->top]);
        return S->data[S->top];
    }
}

//打印栈
void Printstack(sqStack S) 
{
    int i = 0;
    printf("栈底|");
    for (i = 0; i <= S->top; i++)
    {
        printf("%d  ", S->data[i]);
    }
    printf("<-栈顶");
}

//主函数
void main()
{
    int i;
    stack S;
    sqStack Sq;
    Sq = &S; //Sq的初始化
    do
    {
        printf("\n------------****------------\n");
        printf("请输入要执行的操作序号\n");
        printf("1.建立空栈\n");
        printf("2.入栈\n");
        printf("3.出栈\n");
        printf("4.查看栈顶元素\n");
        printf("5.打印栈\n");
        printf("6.判断栈空/满\n");
        printf("0.退出");
        printf("\n------------****------------\n");
        printf("请输入序号:");
        scanf_s("%d", &i);
        printf("\n");
        switch (i)
        {
            case 1: Sq=Create(); break;
            case 2:InStack(Sq,i); break;//i为任意的整数,为了节省空间故用i代替
            case 3:OutStack(Sq); break;
            case 4:VistStack(Sq);break;
            case 5:Printstack(Sq); break;
            case 6:IsFull(Sq); break;
            case 0:printf("结束"); break;
            default:printf("输入错误!请输入0---6的整数");

        }
    } while (i != 0);
    getchar();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值