顺序栈

栈是一种只能在一端进行插入或删除操作的线性表。允许进行操作的一端称为栈顶

顺序栈是用数组的方式表示的。

特点:先进后出

顺序栈的结构体声明

typedef struct stack{
    data_t data[N];
    int top;
}STACK;

top指向栈顶元素的下一个数组下标

顺序栈的操作

基本操作:创建、入栈(单端插入)、出栈(单端删除)、遍历(打印)等。

创建一个顺序栈

STACK *create()
{
    STACK *stack = (STACK*)malloc(sizeof(STACK));
    memset(stack->data,0,sizeof(data_t)*N);
    stack->top = 0;
}

初始化栈,top指向数组下标0

判断栈是否为满

int isFull(STACK *stack)
{
    return stack->top==N?1:0;
}

判断栈是否为空

int isEmpty(STACK *stack)
{
    return stack->top==0?1:0;
}

入栈(单端插入)

void push(STACK *stack,data_t val)
{
    if(isFull(stack)){
        printf("栈满\n");
        return;
    }
    stack->data[stack->top] = val;
    stack->top++;
}

出栈(单端删除)

void pop(STACK *stack)
{
    if(isEmpty(stack)){
        printf("栈空\n");
        return;
    }
    stack->top--;
}

遍历(打印)

void printStack(STACK *stack)
{
    int i = stack->top;
    //while(stack->top!=0)//传进来的是地址
    while(i!=0)
    {
        i--;
        printf("%d ",stack->data[i]);
    }
    putchar(10);
}

示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100
typedef int data_t;
typedef struct stack{
    data_t data[N];
    int top;
}STACK;

STACK *create();
int isFull(STACK *stack);
int isEmpty(STACK *stack);
void push(STACK *stack,data_t val);
void printStack(STACK *stack);
void pop(STACK *stack);

int main(int argc, const char *argv[])
{
    STACK *stack = create();
    push(stack,1);
    push(stack,2);
    push(stack,3);
    push(stack,4);
    push(stack,5);
    printStack(stack);//5 4 3 2 1
    pop(stack);
    printStack(stack);//4 3 2 1
    return 0;
}
//创建一个顺序栈
STACK *create()
{
    STACK *stack = (STACK*)malloc(sizeof(STACK));
    memset(stack->data,0,sizeof(data_t)*N);
    stack->top = 0;
}
//判断栈是否为满
int isFull(STACK *stack)
{
    return stack->top==N?1:0;
}
//判断栈是否为空
int isEmpty(STACK *stack)
{
    return stack->top==0?1:0;
}
//插入数据(入栈)
void push(STACK *stack,data_t val)
{
    if(isFull(stack)){
        printf("栈满\n");
        return;
    }
    stack->data[stack->top] = val;
    stack->top++;
}
//遍历
void printStack(STACK *stack)
{
    int i = stack->top;
    //while(stack->top!=0)//传进来的是地址
    while(i!=0)
    {
        i--;
        printf("%d ",stack->data[i]);
    }
    putchar(10);
}
//删除数据(出栈/弹栈)
void pop(STACK *stack)
{
    if(isEmpty(stack)){
        printf("栈空\n");
        return;
    }
    stack->top--;
}

结果

5 4 3 2 1
4 3 2 1
Last modification:2021 年 03 月 26 日 09 : 18 : 02