[开心IT面试题] 栈的顺序栈、链栈实现

    C++面试题中很大一个板块——数据结构,主要包括线性表、栈、队列、字符串、二叉树等等,今天我们说说栈。


一、概念

    栈是限定性线性表,限制在表的一端进行插入和删除的线性表。允许插入、删除的一端称为栈顶,栈顶的当前位置是动态变化的,只能在栈顶对栈进行操作;不允许插入、删除的另一端称之为栈底,栈底是固定不变的,当表中没有元素时称为空栈。栈的特性是先进后出。栈的存储方式有两种:顺序存储结构和链式存储结构。


二、顺序存储结构

    用一组连续的存储单元依次存放自栈底到栈顶的数据元素,设一个位置指针top(栈顶指针)动态指示栈顶元素在序栈中的位置。数据元素可以是任意类型的数据,但所有的数据元素必须是同一种类型。top=-1 表示空栈。

    1.存储结构

typedef int SElemType;          //变量类型
#define STACK_SIZE 100          //栈的初始大小

typedef struct SeqStack
{
    SElemType data[STACK_SIZE];
    int top;
}SeqStack, *pSeqStack;

    2.初始化栈

void Init_SeqStack(SeqStack *stack)
{
    stack->top = -1;
}

    3.判断栈是否为空

bool IsEmpty_SeqStack(SeqStack *stack)
{
    if(stack->top == -1)
    {
        return true;
    }else
    {
        return false;
    }
}

    4.判断栈是否为满

bool IsFull_SeqStack(SeqStack *stack)
{
    if(stack->top == STACK_SIZE-1)
    {
        return true;
    }else
    {
        return false;
    }
}

    5.进栈运算

bool Push_SeqStack(SeqStack *stack, SElemType value)
{
    if(IsFull_SeqStack(stack))
    {
        return false;
    }
    stack->top++;
    stack->data[stack->top] = value;
    return true;
}

    6.出栈运算

bool Pop_SeqStack(SeqStack *stack, SElemType *value)
{
    if(IsEmpty_SeqStack(stack))
    {
        return false;
    }
    *value = stack->data[stack->top];
    stack->top--;
    return true;
}

    7.返回栈顶元素

int GetTop_SeqStack(SeqStack *stack)
{
    if(IsEmpty_SeqStack(stack))
    {
        return -1;
    }else
    {
        return stack->data[stack->top];
    }
}


二、链式存储结构

    采用带头结点的单链表实现链栈。头指针top就作为栈顶指针,始终指向当前栈顶元素前面的头结点。

    若top->next=NULL,则代表空栈。

    1.存储结构

typedef int SElemType;          //变量类型

typedef struct LinkStackNode
{
    SElemType data;
    struct LinkStackNode *next;
}LinkStackNode, *pLinkStackNode;

    2.初始化栈

void Init_LinkStack(LinkStackNode *stack)
{
    if(stack)
    {
        stack->next = NULL;
    }
}

    3.销毁栈

void Destroy_LinkStack(LinkStackNode *stack)
{
    LinkStackNode *p, *q;
    if(stack != NULL)
    {
        p = stack;
        while(p->next != NULL)
        {
            q = p->next;
            p->next = p->next->next;
            free(q);
        }
    }
    stack = NULL;
}

    4.判断栈是否为空

bool IsEmpty_LinkStack(LinkStackNode *stack)
{
    if(stack->next == NULL)
    {
        return true;
    }else
    {
        return false;
    }
}

    5.进栈运算

bool Push_LinkStack(LinkStackNode *stack, SElemType value)
{
    LinkStackNode *stackNode;
    stackNode = (LinkStackNode*)malloc(sizeof(LinkStackNode));
    stackNode->data = value;
    stackNode->next = stack->next;
    stack->next = stackNode;
    return true;
}

    6.出栈运算

bool Pop_LinkStack(LinkStackNode *stack, SElemType *value)
{
    if(IsEmpty_LinkStack(stack))
    {
        return false;
    }
    LinkStackNode *stackNode , *p;
    p = stack;
    stackNode = p->next;
    p->next = p->next->next;
    *value = stackNode->data;
    free(stackNode);
    return true;
}

    7.返回栈顶元素

int GetTop_LinkStack(LinkStackNode *stack)
{
    if(IsEmpty_LinkStack(stack))
    {
        return -1;
    }else
    {
        return stack->next->data;
    }
}

















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值