图解数据结构---栈和队列

🌞欢迎来到图解数据结构的世界 
🌈博客主页:卿云阁

💌欢迎关注🎉点赞👍收藏⭐️留言📝

🌟本文由卿云阁原创!

📆首发时间:🌹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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卿云阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值