栈与队列的操作(课堂笔记)

一、顺序栈

#include<iostream>
using namespace std;

#define MAXSIZE 100
typedef int Selemtype;
typedef struct
{
	Selemtype data[MAXSIZE];
	int top;  //栈顶
}SqStack;  //顺序栈

int Push(SqStack* s, Selemtype e)
{
	if (s->top == MAXSIZE - 1)  //栈满
		return 0;
	s->top++;
	s->data[s->top] = e;
	return 1;
}

int Pop(SqStack* s, Selemtype& e)
{
	if (s->top == -1)
		return 0;
	e = s->data[s->top];
	s->top--;
	return 1;
}

二、链栈

#include<iostream>
using namespace std;

#define MAXSIZE 100
typedef int Selemtype;

typedef struct StackNode
{
	Selemtype data;
	struct StackNode* next;
}StackNode,*LinkStackPtr;

typedef struct LinkStack
{
	LinkStackPtr top;
	int count;
}LinkStack;

int Push(LinkStack* S, Selemtype e)
{
	LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
	s -> data = e;
	s->next = S->top;
	S->top = s;
	S->count++;
	return 1;
}

int Pop(LinkStack* S, Selemtype& e)
{
	LinkStackPtr p;
	if (StackEmpty(*S))
		return 0;
	e = S->top->data;
	p = S->top;
	S->top = S->top->next;
	free(p);
	S->count--;
	return 1;
}

三、循环队列的顺序存储结构

#include<iostream>
using namespace std;

#define MAXSIZE 100
typedef int Qelemtype;

typedef struct
{
	Qelemtype data[MAXSIZE];
	int front;  //头指针
	int rear;  //尾指针,若队列不空,指向队列尾元素的下一个位置
}SqQueue;  //顺序循环队列

int InitQueue(SqQueue* Q)  //初始化
{
	Q->front = 0;
	Q->rear = 0;
	return 1;
}

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

int EnQueue(SqQueue* Q, Qelemtype e)
{
	if ((Q->rear + 1) % MAXSIZE == Q->front)//队列满
		return 0;
	Q->data[Q->rear] = e;
	Q->rear = (Q->rear + 1) % MAXSIZE;  //指针后移一位
	return 1;
}

int DeQueue(SqQueue* Q, Qelemtype& e)
{
	if (Q->front == Q->rear)//队列空
		return 0;
	e = Q->data[Q->front];
	Q->front = (Q->front + 1) % MAXSIZE;//指针后移
	return 1;
}

四、链式队列

#include<iostream>
using namespace std;

#define MAXSIZE 100
typedef int Qelemtype;

typedef struct QNode
{
	Qelemtype data;
	struct QNode* next;
}QNode,*QueuePtr;

typedef struct
{
	QueuePtr front, rear;
}LinkQueue;  //队列的链表结构

int EnQueue(LinkQueue* Q, Qelemtype e)
{
	QueuePtr s = (QueuePtr)malloc(sizeof(QNode));
	if (!s)
		return 0;
	s->data = e;
	s->next = NULL;
	Q->rear->next = s;  //队列尾加入新元素
	Q->rear = s;
	return 1;
}

int DeQueue(LinkQueue* Q, Qelemtype& e)
{
	QueuePtr p;
	if (Q->front == Q->rear)
		return 0;
	p = Q->front->next;
	e = p->data;
	Q->front->next = p->next;
	if (Q->rear == p)
		Q->rear = Q->front;
	free(p);
	return 1;
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值