数据结构之栈(三)

一、栈的定义

  栈是一种特殊的线性表,允许在同一端进行插入和删除操作,遵循“先进后出”的原则。

  栈的基本操作:入栈(Push)、出栈(Pop)。

二、栈的分类

  栈可以分为:顺序栈和链栈。

  (1)顺序栈

  顺序栈是栈的顺序存储结构的简称,它是一个运算受限的顺序表。

  使用C语言定义顺序栈类型的格式。

#define StackSize 100    //预分配的栈空间最多为100个元素
typedef char DataType;   //栈元素的数据类型为字符
typedef struct  
{
    DataType data[StackSize];
    int top;
}SeqStack;

  初始化栈,将栈置空

void InitStack(SeqStack *S)
{
    //将顺序栈置空
    S->top = -1;
}

  判断栈是否为空

int StackEmpty(SeqStack *S)
{
    return S->top == -1;
}

  判断栈是否为满

void StackFull(SeqStack *S)
{
    return S->top == StackSize - 1;
}

  压栈

void Push(S, x)
{
    if (StackFull(S))
    {
        Error("Stack overflow");//上溢,退出运行
    }
    S->data[++S->top] = x;//栈顶指针加1后将x入栈
}

  出栈

DataType Pop(S)
{
    if (StackEmpty(S))
    {
        Error("Stack underflow");//下溢,退出运行
    }
    return S->data[S->top--];//栈顶元素返回后将指针减1
}

  取栈顶元素

DataType StackTop(S)
{
    if (StackEmpty(S))
    {
        Error("Stack is empty!");
    }
    return S->data[S->top];
}

  (2)链栈

  C语言定义链栈类型的代码如下:

typedef struct stacknode
{
    DataType data;
    struct stacknode *next;
}StackNode;
typedef struct 
{
    StackNode *top;   //栈顶指针
}LinkStack;

  将栈置空 

void InitStack(LinkStack *S)
{
    S->top = NULL;
}

  判断栈是否为空

int StackEmpty(LinkStack *S)
{
    return S->top == NULL;
}

  进栈

void Push(LinkStack *S, DataType x)
{
    //将元素x插入栈链头部
    StackNode *p = (StackNode *)malloc(sizeof(StackNode));
    p->data = x;
    p->next = S->top;//将新节点*p插入链栈头部
    S->top = p;
}

  退栈

DataType Pop(LinkStack *S)
{
    DataType x;
    StackNode *p = S->top; //保存栈顶指针
    if (StackEmpty(S))
    {
        Error("Stack underflow.");//下溢
    }
    x = p->data; //保存栈顶节点数据
    S->top = p->next; //将栈顶节点从链上摘下
    free(p);
    return x;
}

  获取栈顶元素

DataType StackTop(LinkStack *S)
{
    if (StackEmpty(S))
    {
        Error("Stack is empty!");
    }
    return S->top->data;
}
原文地址:https://www.cnblogs.com/hxf175336/p/9867347.html