顺序存储优缺点
栈是操作受限的线性表,只能在栈的一端(栈顶)进行入栈和出栈,所以是先进后出 或是后进先出的线性表。经典案例有进制转换,括号匹配的检验,表达式求值等
优点:
1.插入删除都是在栈顶,时间复杂度O(1)
2.空间利用率高,采用连续的存储空间存储元素
缺点:
1.栈溢出问题:由于顺序栈的存储空间是有限的,当入栈的元素超过栈的容量时,就会发生栈溢出问题,需要采取相应的措施进行处理。
2.扩容开销:容量创建时时固定的,当栈中元素个数超过最大容量时,要进行扩容操作,需要将原栈中元素复制到新栈中,很麻烦。
代码实现(C语言)
定义顺序栈
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100 //最大容量
typedef int SElemType; //栈中元素类型
typedef struct {
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int StackSize; //栈的大小
} SeqStack; //栈
typedef enum {
//程序返回值状态码
OK =1,
OVERFLOW = 0,
TRUE = 1,
FALSE = 0,
} Status;
初始化栈
Status InitStack(SeqStack *S) {
S->base = (SElemType *)malloc(sizeof(SElemType) * MaxSize);//动态分配栈内存大小
if (!S->base) //等价于S->base == NULL
{
printf("内存分配失败!");
return OVERFLOW;
}
S->top = S->base; //栈顶指针指向栈底表示空栈
S->StackSize = MaxSize;
return OK;
}
判栈空
Status StackEmpty(SeqStack *S)
{
if(S->top == S->base) //空栈条件
return TRUE;
else
return FALSE;
}
判栈满
Status StackFull(SeqStack *S)
{
if(S->top - S->base == S->StackSize) //栈满条件,用栈顶指针-栈底指针 看是不是等于栈的大小 相等表示栈满
return TRUE;
else
return FALSE
}
入栈
Status Push(SeqStack *S, SElemType e)
{
if (StackFull(S))
{
printf("栈满,不能入栈!");
return FALSE;
}
*(S->top++) = e; // 等价于 S->top = e ; S->top++;
return OK;
}
出栈
Status Pop(SeqStack *S, SElemType *e)
{
if (