定义:只允许在一端 进行插入或者删除操作的线性表
基本结构图如下:
注:n个不同元素进入栈,能够获取: C 2 n n n + 1 \dfrac {C^n_{2n}}{n+1} n+1C2nn(卡特兰数)
个不同出栈序列
利用一组地址连续的存储单元存放自栈底到栈顶的数据元素
#define MaxSize 50 //定义栈的空间大小
typedef struct{
int data[MaxSize]; //存储元素
int top; //栈顶指针
}SqStack;
注意:1、空栈条件top == -1;
2、栈满条件S.top == MaxSize-1;
通常情况栈的插入和删除在表头进行,链式结构如下
typedef struct Linknode{
int data; //数据域
struct Linknode *next; //指针域
}*LiStack;
注意:1、在进行数据结构类条件判断时,需注意指针所对应的初始位置。指针指向会影响到对应操作(如此处的栈空、栈满条件)
2、空栈top == NULL;
3、不存在栈满溢出情况
void InitStack(SqStack &S){
S.top = -1; //初始化栈顶指针
}
bool IsEmpty(SqStack S){
if(S.top == -1)
return true; //栈空
else
return false;
}
bool Push(SqStack &S, int x){
if(S.top == MaxSize-1) //栈满?
return false;
S.data[++S.top] = x; //指针加1,然后入栈
return true;
}
bool Pop(SqStack &S, int &x){
if(S.top == -1) //栈空?
return false;
x = S.data[S.top--]; //先出栈,指针减1
return true;
}
注意:队列操作,不可以随意读取队列中的某个数据。
#define MaxSize 50 //定义元素的最大个数
typedef struct{
int data[MaxSize]; //存放队列元素
int front, rear; //队头指针和队尾指针
}SqQueue;
typedef struct{ //链式队列结点
int data;
struct LinkNode *next;
}LinkNode;
typedef struct{ //链式队列
LinkNode *front,*rear;
}LinkQueue;
void InitQueue(LinkQueue &Q){
Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode)); //建立头结点
Q.front->next = NULL;
}
bool IsEmpty(LinkQueue Q){
if(Q.front == Q.rear)
return true;
else
return false;
}
void EnQueue(LinkQueue &Q, int x){
LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = x; //创建新结点,插入到链尾
s->next = NULL;
Q.rear->next = s;
Q.rear = s;
}
bool DeQueue(LinkQueue &Q, int &x){
if(Q.front == Q.rear) return false; //空队
LinkNode *p = Q.front->next;
x = p->data;
Q.front->next = p->next;
if(Q.rear == p)
Q.rear = Q.front; //原队列只有一个结点,删除后变空
free(p);
return true;
}
(引入循环队列,为了防止判别队满情况时出现“假溢出”现象)
入队:rear = (rear+1)%MaxSize //队尾指针加1
出队:front = (front+1)%MaxSize //队首指针加1
队列长度:(rear+Maxsize-front)%Maxsize
判断队空队满
考研小注:
小狼的相关博文:
14. 算法(Algorithm)与数据结构(Data Structure)——索引