数据结构之栈的顺序存储结构

187 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、栈的定义

栈是限定仅在表尾进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶,另一端称为栈底。栈是一种后进先出的线性表。

二、顺序栈的定义

栈的顺序存储实质上就是线性表顺序存储的简化。因为栈底元素变化较小,因此我们将下标为0的一端作为栈底,用一个top变量来指示栈顶。空栈时,top=-1。

/*顺序栈的结构定义*/
typedef struct 
{
    ElementType data[MAXSIZE];
    int top;
}SqStack;

三、顺序栈的相关操作实现

1.栈的初始化

/*创建一个空栈*/
void InitStack(SqStack *stack)
{
    stack->top=-1;
}

2.置为空栈

/*将stack置为空栈*/
void ClearStack(SqStack *stack)
{
    stack->top=-1;
}

3.返回栈的长度

/*返回栈的长度*/
int StackLength(SqStack stack)
{
    return stack.top+1;
}

4.返回栈顶元素

/*返回栈顶元素,并判断栈是否为空*/
int GetTop(SqStack stack,ElementType *e)
{
    if(stack.top==-1)
    return 0;
    else
    *e=stack.data[stack.top];

    return 1;
}

5.压栈和弹栈的实现

/*压栈元素e*/
int Push(SqStack *stack,ElementType e)
{
    if(stack->top == MAXSIZE -1)
    {
        return 0;
    }
    stack->top++;
    stack->data[stack->top]=e;

    return 1;
}

/*弹栈栈顶元素*/
int Pop(SqStack *stack,ElementType *e)
{
    if(stack->top==-1)
    return 0;

    *e=stack->data[stack->top];
    stack->top--;

    return 1;
}

6.遍历输出栈中元素

/*从栈底到栈顶依次遍历输出每个数据元素*/
void StackTraverse(SqStack stack)
{
    int i=0;
    while(i<=stack.top)
    {
        printf("%d ",stack.data[i]);
        i++;
    }
    printf("\n");
}

四、具体代码实现

#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 100

typedef int ElementType;

/*顺序栈的结构定义*/
typedef struct 
{
    ElementType data[MAXSIZE];
    int top;
}SqStack;

/*创建一个空栈*/
void InitStack(SqStack *stack)
{
    stack->top=-1;
}

/*将stack置为空栈*/
void ClearStack(SqStack *stack)
{
    stack->top=-1;
}

/*返回栈的长度*/
int StackLength(SqStack stack)
{
    return stack.top+1;
}

/*返回栈顶元素,并判断栈是否为空*/
int GetTop(SqStack stack,ElementType *e)
{
    if(stack.top==-1)
    return 0;
    else
    *e=stack.data[stack.top];

    return 1;
}

/*压栈元素e*/
int Push(SqStack *stack,ElementType e)
{
    if(stack->top == MAXSIZE -1)
    {
        return 0;
    }
    stack->top++;
    stack->data[stack->top]=e;

    return 1;
}

/*弹栈栈顶元素*/
int Pop(SqStack *stack,ElementType *e)
{
    if(stack->top==-1)
    return 0;

    *e=stack->data[stack->top];
    stack->top--;

    return 1;
}

/*从栈底到栈顶依次遍历输出每个数据元素*/
void StackTraverse(SqStack stack)
{
    int i=0;
    while(i<=stack.top)
    {
        printf("%d ",stack.data[i]);
        i++;
    }
    printf("\n");
}

void StackTest()
{
    SqStack stack;
    int i;
    ElementType e;

    InitStack(&stack);
    for(i=0;i<7;i++)
    {
        Push(&stack,i);
    }
    printf("The elements in the stack are:\n");
    StackTraverse(stack);

    Pop(&stack,&e);
    printf("The pop-up stack top element is:%d\n",e);

    GetTop(stack,&e);
    printf("The top element of the stack is :%d The length of the stack is %d\n",e,StackLength(stack));

    ClearStack(&stack);

    printf("After emptying the stack, the length of the stack:%d",StackLength(stack));
}

int main()
{
    StackTest();

    return 0;
}

五、样例输出

The elements in the stack are: 0 1 2 3 4 5 6

The pop-up stack top element is:6

The top element of the stack is :5 The length of the stack is 6

After emptying the stack, the length of the stack:0

六、写在最后

这里是数据结构个人学习的笔记记录,如有问题欢迎指正说明。