一、栈的定义
栈是一种重要的线性结构,可以这样讲,栈是前面讲过的线性表的一种具体形式。 就像我们刚才的例子,栈这种后进先出的数据结构应用是非常广泛的。在生活中,例如我们的浏览器,每点击一次“后退”都是退回到最近的一次浏览网页。 例如我们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
关注公众号"小败日记",搬砖过程遇到的问题,大家一起探讨,资源共享