数据结构及算法基础 之栈与队列(一)


 
 

一、栈的定义

  栈是一种重要的线性结构,可以这样讲,栈是前面讲过的线性表的一种具体形式。 就像我们刚才的例子,栈这种后进先出的数据结构应用是非常广泛的。在生活中,例如我们的浏览器,每点击一次“后退”都是退回到最近的一次浏览网页。 例如我们Word,Photoshop等的“撤销”功能也是如此。再例如我们C语言的函数,也是利用栈的基本原理实现的。

  官方定义:栈(Stack)是一个后进先出(Last in first out,LIFO)的线性表,它要求只在表尾进行删除和插入操作。

  栈的操作只能在这个线性表的表尾进行。 注:对于栈来说,这个表尾称为栈的栈顶(top),相应的表头称为栈(bottom)。

 
栈的插入和删除操作:

  • 栈的插入操作(Push),叫做进栈,也称为压栈,入栈。类似子弹放入弹夹的动作。
  • 栈的删除操作(Pop),叫做出栈,也称为弹栈。如同弹夹中的子弹出夹。

栈的顺序存储结构:
  因为栈的本质是一个线性表,线性表有两种存储形式,那么栈也有分为栈的顺序存储结构和栈的链式存储结构。 最开始栈中不含有任何数据,叫做空栈,此时栈顶就是栈底。然后数据从栈顶进入,栈顶栈底分离,整个栈的当前容量变大。数据出栈时从栈顶弹出,栈顶下移,整个栈的当前容量变小。

 

二、代码实例

stack.h

#ifndef __STACK__H
#define __STACH__H
typedef int ElemType;
typedef struct _stack {
    ElemType *top;
   ElemType *base;
   int stackSize;
} stack_s, *stack_p;
 
int createStack(stack_p stack, int stackSize);
int isFullStack(stack_p stack);
int isEmptyStack(stack_p stack);
int isLengthStack(stack_p stack);
int pushStack(stack_p stack, ElemType value);
int popStack(stack_p stack, ElemType *value);
int printfStack(stack_p stack);
#endif

stack.c

#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
 
 
 
/*创建栈*/
int createStack(stack_p stack, int stackSize)
{
    stack->base = (ElemType *)malloc(sizeof(ElemType) * stackSize);
    if (NULL == stack->base) {
        perror("malloc error");
        return -1;
    }
    stack->top = stack->base;
    stack->stackSize = stackSize;
    return 0;
}
 
 
/*判断栈是否为满*/
int isFullStack(stack_p stack)
{
    if (!stack)
        return -1;
    return (stack->top - stack->base) == stack->stackSize;
}
 
/*判断栈是否为空*/
int isEmptyStack(stack_p stack)
{
    if (!stack)
        return -1;
    return stack->top == stack->base;
}
 
 
/*返回栈的长度*/
int isLengthStack(stack_p stack)
{
    if (!stack)
        return -1;
    return stack->top - stack->base;
}
 
 
/*向栈中放入元素*/
int pushStack(stack_p stack, ElemType value)
{
    if (!stack)
        return -1;
    if (isFullStack(stack))
        return -1;
    *(stack->top) = value;
    (stack->top) ++;
    return 0;
}
 
 
/*向栈中取出元素*/
int popStack(stack_p stack, ElemType *value)
{
    if (!stack)
        return -1;
    if (isEmptyStack(stack))
        return -1;
    *value = *--(stack->top);
    return 0;
}
 
 
/*打印*/
int printfStack(stack_p stack)
{
    int i;
    if (!stack)
        return -1;
    for (i = 0; i < isLengthStack(stack); i++)
        printf("%d\t", *((stack->base) + i));
    printf("\n");
    return 0;
}
 
 
 
#if 1
 
/*测试*/
#define STACK_SIZE 100
int main(int argc, char **argv)
{
    int i;
    ElemType e;
    stack_s sk;
 
    createStack(&sk, STACK_SIZE);
 
    printf("It is empty stack ?\t%s\n", isEmptyStack(&sk) ? "Yes" : "No");
    for (i = 0; i < 10; i ++)
        pushStack(&sk, i);
    printf("It is empty stack ?\t%s\n", isEmptyStack(&sk) ? "Yes" : "No");
     
    printf("length: %d\n", isLengthStack(&sk));
    printfStack(&sk);
     
    popStack(&sk, &e);
    printf("length: %d   value: %d\n", isLengthStack(&sk), e);
    printfStack(&sk);
     
    popStack(&sk, &e);
    printf("length: %d   value: %d\n", isLengthStack(&sk), e);
    printfStack(&sk);
 
    popStack(&sk, &e);
    printf("length: %d   value: %d\n", isLengthStack(&sk), e);
    printfStack(&sk);
    return 0;
}
 
#endif

 
 
 
 
 
 
 
关注公众号"小败日记",搬砖过程遇到的问题,大家一起探讨,资源共享

小败日记公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值