栈和队列
线性表
,但限定这种线性表只能在某一端进行插入和删除操作#define MaxSize 10
typedef struct {
int data[MaxSize];
int top;
}SqStack;
//初始化
void InitStack(SqStack& S) {
S.top = -1; //data[0]还没有放数据元素
}
//入栈
bool Push(SqStack& S, int x) {
if (S.top == MaxSize - 1)
return false;
S.top = S.top + 1;//初始指向data[-1]
S.data[S.top] = x;
//等价于
//S.data[++S.top] = x;
return true;
}
//出栈
bool Pop(SqStack& S, int& x) {
if (S.top == -1)
return false;
x = S.data[S.top];
S.top = S.top - 1;
//等价于
//x = S.data[S.top--];
return true;
}
//读栈顶元素
bool GetTop(SqStack S, int& x) {
if (S.top == -1)
return false;
x = S.data[S.top];
return true;
}
//判断栈是否为空
bool StackEmpty(SqStack S) {
if (S.top == -1) //栈空
return true;
else
return false;
}
#define MaxSize 10
typedef struct {
int data[MaxSize];
int top0;
int top1;
}ShStack;
ShStack s; //全局变量
//初始化栈
void InitStack(ShStack& s) {
s.top1 = MaxSize; //上
s.top0 = -1;//下
}
//入栈
int push(int i, int x) {
if (i < 0 || i>1) {
cout << "栈号输入不对" << endl;
exit(0);
}
if (s.top1 - s.top0 == 1) {
cout << "栈满了" << endl;
return 0;
}
switch (i)
{
case 0:s.data[++s.top0] = x;
break;
case 1:s.data[--s.top1] = x;
break;
}
}
//出栈
int pop(int i) {
if (i < 0 || i>1) {
cout << "栈号输入错误" << endl;
exit(0);
}
switch (i) {
case 0:
if (s.top0 == -1) {
cout << "栈空" << endl;
}
else {
//return s.data[s.top0--];
cout << s.data[s.top0--] << endl;
}
break;
case 1:
if (s.top1 == MaxSize) {
cout << "栈空" << endl;
}
else {
//return s.data[s.top1++];
cout << s.data[s.top1++] << endl;
}
break;
}
}
类似单链表的头插法
#define MaxSize 10
typedef struct {
int data[MaxSize];
int front, rear; //队头和队尾指针
}SqQueue;
//初始化
void InitQueue(SqQueue& Q) {
Q.rear = Q.front = 0;
}
//入队
bool EnQueue(SqQueue& Q, int x) {
if ((Q.rear + 1) % MaxSize == Q.front) //牺牲一个节点空间
return false;
Q.data[Q.rear] = x;
Q.rear = (Q.rear + 1) % MaxSize;
return true;
}
//出队
bool DeQueue(SqQueue& Q, int& x) {
if (Q.rear == Q.front) //判断队空
return false;
x = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize;
return true;
}
//获取队头元素
bool GetHead(SqQueue Q, int& x) {
if (Q.rear == Q.front)
return false;
x = Q.data[Q.front];
return true;
}
//判断队列是否为空
bool QueueEmpty(SqQueue Q) {
if (Q.rear == Q.front) //对空条件
return true;
else
return false;
}
typedef struct LinkNode {
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;
}
//入队
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;
}
//判断队列是否为空
bool IsEmpty(LinkQueue Q) {
if (Q.front == Q.rear)
return true;
else
return false;
}
typedef struct LinkNode {
int data;
struct LinkNode* next;
}LinkNode;
typedef struct {
LinkNode* front, * rear; //队头和队尾指针
}LinkQueue;
//初始化
void InitQueue(LinkQueue& Q) {
Q.front = NULL;
Q.rear = NULL;
}
//入队(不带头结点)
void EnQueue(LinkQueue& Q, int x) {
LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = x;
s->next = NULL;
if (Q.front == NULL) {
Q.front = s;
Q.rear = s;
} else {
Q.rear->next = s;
Q.rear = s;
}
}
//出队(不带头结点)
bool DeQueue(LinkQueue& Q, int& x) {
if (Q.front == NULL)
return false;
LinkNode* p = Q.front;
x = p->data;
Q.front = p->next;
if (Q.rear == p) { //此次是最后一个节点出队
Q.front = NULL;
Q.rear = NULL;
}
free(p);
return true;
}
//判断队列是否为空
bool IsEmpty(LinkQueue Q) {
if (Q.rear == NULL)
return true;
else
return false;
}
此博文的分享就到此啦,点个
关注
再走吧
✨你好啊,我是“ 满级小白”,是一名在校大学生。
主页链接:满级小白的博客
☀️博文主更方向为:计算机408
,数据库
,javaEE
随着专业的深入会越来越广哦…一起期待。
❤️人生的每一次成长,都是从“觉得自己是个傻逼”开始的,人生每一次的陷入困境,都是从“觉得别人是个傻逼”开始的。
很高兴与你相遇,一起加油!!!!