数据结构-栈

    • 1、栈的概念
      • 栈的ADT定义
    • 2、顺序栈的结构体定义
      • 2.1、栈的初始化
      • 2.2、入栈
      • 2.3、出栈
      • 2.4、取栈顶的值
      • 2.5、遍历栈内的所有元素
    • 3、栈与一般线性表的区别
    • 4、栈的应用

1、栈的概念

是一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
数据结构-栈_第1张图片

栈的ADT定义

栈的简单结构体定义:

typedef int ElemType
typedef struct Stack
{
    ElemType data[MAXSIZE];
    int top; //栈顶指针
}Stack;

栈的基本操作

1)InitStack(&S):初始化空栈S

2)StackEmpty(S):判断一个栈是否为空

3)Push(&S,x):进栈,若栈未满,则将x加入使之成为新栈顶

4)Pop(&S,&x):出栈,若栈非空,则将栈顶元素,并用x返回

5GetTop(S,&x):读栈顶元素,若栈顶元素非空,则用x返回栈顶元素

6DestroyStack(&S):销毁栈,并释放栈S占用的存储空间

2、顺序栈的结构体定义

采用顺序存储方式的栈称为顺序栈,是由一组地址连续的存储单元来存放自栈底至栈顶的数据元素,同时会有一个指针(top)指示当前栈顶的位置,并由一个maxsize指定容量即栈中元素额最大个数。

#include
#include
#define MAXSIZE 100
typedef int SElemType;

typedef  struct{
    SElemType *base;
    SElemType *top;
    int stacksize;//栈的最大容量
}SqStack;

其中,栈顶指针:top,初始时设置top = -1;
栈顶元素:data[top];
进栈操作:栈不满时,栈指针加1,再送值到栈顶元素;
出栈操作:栈非空时,先去栈顶元素值,再将栈顶指针减1;
栈空条件:top == -1;
栈满条件:top == MAXSIZE - 1;
栈长:top + 1;

2.1、栈的初始化

void init(SqStack &S){
	//定义一个数组,长度为MAXSIZE
    S.base=new SElemType[MAXSIZE];
    if(!S.base) exit; //如果不存在就退出
    S.top=S.base; //栈顶和栈底指向相等
    S.stacksize=MAXSIZE;  //栈的长度
}

2.2、入栈

void push(SqStack &S,SElemType e){
    if(S.top-S.base==S.stacksize) printf("该栈已满");
    *S.top=e;
    S.top++;
    printf("入栈成功");
}

2.3、出栈

void pop(SqStack &S,SElemType e){
    if(S.top==S.base) printf("该栈为空");
    S.top--;
    e=*S.top;
    printf("出栈成功");
}

2.4、取栈顶的值

SElemType  getTop(SqStack S){
    //栈非空时返回
    if(S.top!=S.base){
        return *(S.top-1);
    }
}

2.5、遍历栈内的所有元素

//从栈顶开始遍历
void printStackTop(SqStack S){
	printf("栈顶:");
	while(S.top!=S.base){
    	printf("%d ",*(S.top-1));   
    	S.top--;
	}
	printf("\n");
}

//从栈底开始遍历
void printStackBottom(SqStack S){
	printf("栈底:");
	SElemType *p=S.base;
	while(p!=S.top){
		printf("%d  ",*p);
		p++;
    }
    printf("\n");

}

3、栈与一般线性表的区别

数据结构-栈_第2张图片

4、栈的应用

应用场景:括号的匹配、递归运算、进制的转换等;

参考资料:数据结构与算法基础-王卓老师

你可能感兴趣的:(数据结构与算法,数据结构)