C/C++语言数据结构快速入门(代码解析+内容解析)栈
Posted 蓝盒子bluebox
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++语言数据结构快速入门(代码解析+内容解析)栈相关的知识,希望对你有一定的参考价值。
一、栈(Stack)
1、栈的基本概念
注:数据结构三要素――逻辑结构、数据的运算、存储结构(物理结构)
存储结构不同
运算的实现方式不同
(1)栈的定义
线性表是具有相同数据类型的n (n>0)个数据元素的有限序列,其中n为表长,当n =0时线性表是一个空表。
若用L命名线性表,则其一般表示为
L= (a1, a2, … , ai, ai+1,… , an)
栈( Stack)是只允许在一端进行插入或删除操作的线性表
栈( Stack)是只允许在一端进行插入或删除操作的线性表
(2)重要术语:栈顶、栈底、空栈
栈逻辑结构:与普通线性表相同
数据的运算:插入、删除操作有区别
2、栈的基本操作
(1)穿越:线性表的基本操作
lnitList(&L):初始化表。构造一个空的线性表L,分配内存空间。
DestroyList(&L):销毁操作。销毁线性表,并释放线性表L所占用的内存空间。
ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。
ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。
LocateElem(L,e):按值查找操作。在表L中查找具有给定关键字值的元素。
GetElem(L,i):按位查找操作。获取表L中第i个位置的元素的值。
其他常用操作:
Length(L):求表长。返回线性表L的长度,即L中数据元素的个数。
PrintList(L):输出操作。按前后顺序输出线性表L的所有元素值。
Empty(L):判空操作。若L为空表,则返回true,否则返回false。
(2)栈的基本操作
a、创建和销毁
InitStack(&S):初始化栈。构造一个空栈s,分配内存空间。
DestroyStack(&L):销毁栈。销毁并释放栈s所占用的内存空间。
b、增、删
Push(&S,x)
:进栈,若栈s未满,则将x加入使之成为新栈顶。
Pop(&S,&x)
:出栈,若栈s非空,则弹出栈顶元素,并用x返回。(获取并删除栈顶元素)
c、读取栈顶元素:查:栈的使用场景大多只访问栈顶的元素
GetTop(S,&x):读取栈顶元素。若栈S为非空,则用x返回栈顶元素。(获取但是不删除栈顶元素)
d、其他常用操作
StackEmpty(S):判断一个栈S是否为空。若S为空,则返回true,否则返回false
(3)栈的常考题型
进栈顺序:
a->b->c->d->e
一那些合法的出栈顺序?
第一种情况
第二种情况
知识点回顾
3、顺序栈的实现
顺序栈
(1)顺序栈的定义
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct{
ElemType data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack; //Sq :squence ---顺序
void testStack(){
SqStack S;//声明一个顺序栈(分配空间)
//...后续操作....
}
(2)初始化操作
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct{
ElemType data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack; //Sq :squence ---顺序
//初始化栈
void InitStack(SqStack &S){
S.top = -1; //初始化栈顶指针
}
void testStack(){
SqStack S;//声明一个顺序栈(分配空间)
InitStack(S)
//...后续操作....
}
//判断栈空
bool StackEmpty(SqStack S){
if(S.top == -1)//栈空
return true;
else //不空
return false;
}
(3)进栈操作
#include<stdio.h>
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct{
Elemtype data[MaxSize]; //静态数组存放栈中的元素
int top; //栈顶指针
}SqStack;
//新元素入栈
bool Push(SqStack &S,ElemType x){
if(S.top == MaxSize-1) //栈满,报错
return false;
S.top = S.top + 1; //指针先加1
S.data[S.top] = x; //新元素入栈
return true;
}
如果顺序栈存满
(4)出栈操作
#include<stdio.h>
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct{
Elemtype data[MaxSize]; //静态数组存放栈中的元素
int top; //栈顶指针
}SqStack;
bool Pop(SqStack &S,ElemType &x){
if(S.top == -1) //栈空,报错
return false;
x=S.data[S.top];//栈顶元素先出栈
S.top = S.top - 1; //指针再减1
return true;
}
(5)读取栈顶元素操作
#include<stdio.h>
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct{
Elemtype data[MaxSize]; //静态数组存放栈中的元素
int top; //栈顶指针
}SqStack;
//出栈操作
bool Pop(SqStack &S,ElemType &x){
if(S.top == -1) //栈空,报错
return false;
x=S.data[S.top-1]; //指针再减1
return true;
}
//读取栈顶元素
bool GetTop(SqStack S,ElemType &x){
if(S.top == -1)
return false;
x = S.data[S.top];
return true;
}
另外一种操作
#include<stdio.h>
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct{
Elemtype data[MaxSize]; //静态数组存放栈中的元素
int top; //栈顶指针
}SqStack;
//初始化栈
void InitStack(SqStack &S){
S.top = 0;
}
//读取栈顶元素
void testStack(){
SqStack S;//声明一个顺序栈(分配空间)
InitStack(S);
//...后续操作...
}
//判断栈空
bool StackEmpty(SqStack S){
if(S.top == 0) //栈空
return true;
else //不空
return false;
}
(6)共享栈:两个栈共享同一片空间
#include<stdio.h>
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct{
Elemtype data[MaxSize]; //静态数组存放栈中的元素
int top0; //0号栈顶指针
int top1; //1号栈顶指针
}ShStack;
//初始化栈
void InitStack(ShStack &S){
S.top0 = -1; //初始化栈顶指针
S.top1 = MaxSize;
}
共享栈存满的情况
共享栈存满的情况
(7)知识点回顾与重要考点
4、链栈
(1)穿越:头插法建立单链表
//后插操作:在p结点之后插入元素e
bool InsertNextNode(LNode *p,ElemType e){
if(p == NULL)
return false;
LNode *s = (LNode *)malloc(sizeof(LNode));
if (s == NULL) //内存分配失败
return false;
s->data = e; //用结点s保存数据元素e
s->next = p->next;
p->next = s; //将结点s连到p之后
return true;
}
(2)穿越:单链表的删除操作
链头看为栈顶
(3)链栈的定义
#include<stdio.h>
typedef struct Linknode{
ElemType data; //数据域
struct Linknode *next; //指针域
}*LiStack; //栈类型定义
(4)知识回顾域重要考点
以上是关于C/C++语言数据结构快速入门(代码解析+内容解析)栈的主要内容,如果未能解决你的问题,请参考以下文章
C/C++语言数据结构快速入门(代码解析+内容解析)栈的应用
C/C++语言数据结构快速入门(代码解析+内容解析)队列的应用