🌞欢迎来到图解数据结构的世界
🌈博客主页:卿云阁💌欢迎关注🎉点赞👍收藏⭐️留言📝
🌟本文由卿云阁原创!
📆首发时间:🌹2024年7月17日🌹
✉️希望可以和大家一起完成进阶之路!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
目录
栈的逻辑结构和基本操作
顺序栈的实现
顺序栈的定义和初始化
进栈
出栈
代码实现:
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 5
typedef int ElemType;
typedef struct
{ ElemType data[MaxSize];
int top; //栈顶指针
}SqStack;
//栈的初始化
void InitSqStack(SqStack &S)
{
S.top=-1;
}
//判栈空
bool StackEmpty(SqStack S)
{
if(S.top==-1)
return true;
else
return false;
}
//入栈的操作
bool Push(SqStack &S,ElemType x)
{
if(S.top==MaxSize-1)
return false;
S.top++;
S.data[S.top]=x;
}
//出栈的操作
bool Pop(SqStack &S,ElemType &x)
{
if(S.top==-1)
return false;
x=S.data[S.top];
S.top--;
}
//打印出栈所有的元素
void print(SqStack &S)
{
int i=0;
printf("此时栈中的所有元素:\n");
for(i=0;i<=S.top;i++)
printf("%d ",S.data[i]);
printf("\n");
}
int main()
{
SqStack S;
int x=0;
InitSqStack(S);
printf("入栈0,1,2,3,4:\n");
Push(S,0);
Push(S,1);
Push(S,2);
Push(S,3);
Push(S,4);
print(S);
printf("执行一次出栈:\n");
Pop(S,x);
print(S);
}
读栈顶元素
共享栈
#include<stdio.h>
#define MaxSize 10
typedef struct()
{
int data[MaxSize];
int top0;
int top1;
}
void InitStack()
{
S.top0=-1;
S.top1=MaxSize;
}
链栈的实现
进栈---头节点的后插操作
出栈---头节点的后删操作
代码实现:
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 5
typedef int ElemType;
typedef struct Node
{ ElemType data;
struct Node *next;
}StackNode,*LinkStack;
//栈的初始化
void InitSqStack(LinkStack &top)
{
top=NULL;
}
//栈判空
int StackEmpty(LinkStack top)
{
if(top==NULL)
return true;
else
return false;
}
//进栈操作
void Push(LinkStack &top,ElemType x)
{
LinkStack s;
s=(LinkStack)malloc(sizeof(StackNode));
s->data=x;
s->next=top;
top=s;
}
//出栈操作
int Pop(LinkStack &top,ElemType &x)
{
if(StackEmpty(top))
return false;
LinkStack p;
p=(LinkStack)malloc(sizeof(StackNode));
x=top->data;
p=top;
top=top->next;
free(p);
return true;
}
void print(LinkStack top)
{
LinkStack p;
top=top;
printf("链栈中的元素:\n");
while(top!=NULL)
{
printf("%d ",top->data);
top=top->next;
}
}
int main()
{
LinkStack top;
InitSqStack(top);
int x=0;
printf("链栈的相关操作:\n");
printf("进栈0,1,2,3,4:\n");
Push(top,0);
Push(top,1);
Push(top,2);
Push(top,3);
Push(top,4);
print(top);
printf("\n");
printf("执行一次出栈:\n");
Pop(top,x);
print(top);
}
队列的逻辑结构和基本操作
队列的顺序实现
定义和初始化
#define MaxSize 10
typedef struct
{
int data[MaxSize];
int front,rear;
}SqQueue;
void InitSqQueue(SqQueue &S)
{
int i;
S.front=S.rear=0;
}
int main()
{
SqQueue S;
InitSqQueue(S);
return 0;
}
入队和出队操作
队列的入队和出队
bool EnQueue(SqQueue &S,int e)
{
if((Q.rear+1)%MaxSize==Q.front)
return false;
Q.data[Q.rear]=e;
Q.rear=(Q.rear+1)%MaxSize;
}
bool DeQueue(SqQueue &S,int &e)
{
if(Q.rear+1==Q.front)
return false;
e=Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize;
}
队列的判空和判满
队列的长度
int Length(SqQueue &S)
{
int length;
length=(Q.rear+MaxSize-Q.front)%MaxSize;
return length;
}
队列链式实现
初始化
Q是一个结构体类型(LinkQueue),里面有两个元素,一个是front指针,一个是rear指针,这两个指针均指向,一个结构体类型(LinkNode)。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 10
typedef struct LinkNode
{
int data;
struct LinkNode *next;
}LinkNode;
typedef struct LinkQueue
{
LinkNode *rear,*front;
}LinkQueue;
void InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=(LinkNode *)malloc(sizeof(LinkNode));
Q.front->next=NULL;
}
int main()
{
LinkQueue Q;
InitQueue(Q);
return 0;
}
入队
void EnQueue(LinkQueue &Q,int x)
{
LinkNode *s;
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=x;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
}
出队
void DeQueue(LinkQueue &Q,int &x)
{
LinkNOde *p=Q.front->next;
x=p->data;
Q.front->next=p->next;
free(p);
}