C语言栈和队列总结

栈是限定仅在表尾进行插入和删除操作的线性表

顺序栈

结构定义

typedef int SElenType //先假设为int类型
typedef struct 
{
	SElemType data[MAXSIZE];
	int top;
}Sqstack;

进栈操作

Status Push(Sqstack *S,SElemType e)
{
	if(S->top==MAXSIZE-1)
	return error;	//栈满
	S->top++;		//先让top加1
	S->data[S->top]=e;	//赋值
	return OK;
}

出栈操作

Status Pop(Sqstack *S,SElemType *e)
{
	if(S->top==-1) 		// 空栈
	return error;
	*e=S->data[S->top];	//赋值
	S->top--;		//指针减1
	return OK;
}
两栈共享空间

结构定义

typedef struct
{
	SElemType data[MAXSIZE];
	int top1;
	int top2;
}SqDoubleStack

定义一个大小为n的数组,数组两边分别作为两个栈的栈底。对于push 和pop操作,要区别是那个栈进出,应该增设一个变量stackNumber

Status Push(SqDoubleStack *S, SElemType e, int stackNumber)
{
	if(S->top1==S->top2)	//栈满,不能在push元素
	return error;
	if(StackNumber==1)		//栈1 栈1是数组为0开始的哪一端
		S->data[++S->top1]=e;
	else if(stackNumber==2) //栈2
		S->data[--S->top2]=e;
		return OK;
}
Status Pop(SqDoubleStack *S, SElemType *e, int stackNumber)
{
	if(stackNumber==1)
	{
		if(S->top1==-1)	//栈空
		return error;
		*e=S->data[S->top1--]; //赋值并且自减
		
	}
	if(stackNumber==2)
	{
		if(S->top2==MAXSIZE)	//栈满,栈1占完了
		return error;
		*e=S->data[S->top2++]; //赋值并且自加
	}
	return OK;
}

使用这样的数据结构,通常都是两个栈的空间需求有相反关系时,即一个栈增长,一个缩短的情况。

链栈

结构代码

typedef struct StackNode
{
	SElemType data;
	struct StackNode *next;
}StackNode,*LinkStackPtr; 		//定义结点
typedef struct LinkStack
{
	LinkStackPtr top;		//仅仅是定义一个指向结点的top指针
	int count;				//链表长度
}LinkStack;

进栈操作

Status Push(LinkStack *S,SElemType e)
{
	LinkStackPtr p;
	p=(LinkStackPtr)malloc(sizeof(StackNode))
	p->data=e;
	p->next=S->top;//注意栈的链式存储和单链表的区别,二者的指针方向是相反的
	S->top=p;
	S->count++;
}

出栈操作

Status Pop(LinkStack *S,SElemtType *e)
{
	LinkStackPtr q;
	if(StackEmpty(*S))	//空栈
	return error;
	*e=S->top->data;
	p=S->top;	//p中间变量用于释放空间
	S->top=S->top->next;
	free(p);
	S->count--;
	return OK;
}
递归

一个直接调用自己或通过一系列的调用语句间接调用自己的函数,称做递归函数。
每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值推出。

队列

队列时只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
允许插入的一端称为队尾,允许删除的一端称为队头。

循环队列

队列头尾相接的顺序存储结构称为循环队列
front指针指向对头元素,rear指针指向队尾元素的下一个位置。规定数组还有一个空闲的单元的时候,队列就满了。队列满的条件为 (rear+1)%QueueSize==front
计算队列长度的公式为 (rear-front+QueueSize)%QueueSize
顺序存储结构代码

typedef int QElemType
typedef struct
{
	QElemType data[MAXSIZE];
	int front;
	int rear;
}SqQueue;

循环队列初始化代码

Status initqueue(SqQueue * Q)
{
	Q->front=0;
	Q->rear=0;
	return OK;
}

队列求长度

int queuelength(SqQueue Q)
{
	return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}

循环队列入队操作

Status enqueue(SqQueue *Q, QElemType e)
{
	if((Q.rear+1)%QueueSize==Q->front)//判断是否队满
	return error;
	Q->data[Q->rear]=e;
	Q->rear=(Q->rear+1)%MAXSIZE;	//rear向后移动一位,若到最后则转到头部
}

出队操作

Status dequeue(SqQueue *Q,QElemType *e)
{
	if(Q->front==Q->rear)	//判断是否队空
	return error;
	*e=Q->data[front];
	Q->front=(Q->front+1)%MAXSIZE;	//front向后移动一位,若到最后则转到头部
	return OK;
}

链队列

队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出。
为了操作方便,我们将队头指针指向链队列的头结点,队尾指针则指向终结端点。空队列时,front 和 rear 都指向头结点。
代码结构

typedef int QElemType
typedef struct QNode
{
	QElemType data;
	struct QNode *next;
}QNode,*QueuePtr
typedef struct
{
	QueuePtr front,rear;
}LinkQueue;

入队操作

Status enqueue(LinkQueue * Q, QElemType e)
{
	QueuePtr a=(QueuePtr)malloc(sizeof(QNode))//分配结点a
	if(!a)		//分配失败
	exit(OVERFLOW);
	a->data=e;	//赋值
	a->next=NULL;
	Q->rear->next=a;//把拥有元素e的新节点赋值给原队尾结点的后继
	Q-rear=a;		//更新rear
	return OK;
}

出队操作

Status Dequeue(LinkQueue * Q, QElemType *e)
{
	QueuePtr p;
	if(Q->front==Q->rear)
		return error;	//队空
	p=Q->front->next;//将要删除的队头结点暂存给p
	*e=p->data;//赋值
	Q->front->next=p->next;
	if(Q->rear==p)		//若队头是队尾,即只有一个元素时,则把rear指向头结点
		Q->rear=Q->front;
	free(p);
	return OK;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
队列都是常用的数据结构,用于存储和操作一系列的元素。下面是关于C语言队列的概要设计: 1. 的概要设计: - 是一种后进先出(LIFO)的数据结构,类似于我们日常生活中的堆,只能从顶部进行插入和删除操作。 - 声明结构体,其中包含一个数组用于存储元素,以及一个整数用于记录顶的位置。 - 设计的初始化函数,用于初始化的大小和顶的位置。 - 实现的push函数,即将一个元素放入中,需要更新顶的位置。 - 实现的pop函数,即从中弹出一个元素,也需要更新顶的位置。 - 可以选择添加其他辅助函数,如是否为空、是否已满等等。 2. 队列的概要设计: - 队列是一种先进先出(FIFO)的数据结构,类似于我们日常生活中排队的场景,只能从队列尾部插入元素,从队列头部删除元素。 - 声明队列结构体,其中包含一个数组用于存储元素,以及两个整数用于记录队列头部和尾部的位置。 - 设计队列的初始化函数,用于初始化队列的大小和头尾指针的位置。 - 实现队列的enqueue函数,即将一个元素插入到队列中的尾部,同时更新尾部指针。 - 实现队列的dequeue函数,即删除队列头部的元素,同时更新头部指针。 - 可以选择添加其他辅助函数,如队列是否为空、队列是否已满等等。 总结队列是常用的数据结构,用于在程序中实现对元素的存储和操作。是一种后进先出的数据结构,而队列则是一种先进先出的数据结构。在C语言中,可以通过结构体和数组的组合来实现队列的概要设计,包括初始化函数、插入/删除操作函数以及一些辅助函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值