栈和队列操作

栈,队列,一般线性表的关系

逻辑结构:一对一
存储结构:顺序表,链表
运算规则:随机,顺序存取(栈:后进后出
队列:后进先出

栈和队列的操作

顺序栈的操作

头文件及宏

#include "pch.h"
#include <iostream>
#include <fstream>
using namespace std;

#define OK			1
#define ERROR		0
#define OVERFLOW	-2
#define MAXSIZE		50

typedef int Status;			
typedef char SElemType;		

顺序栈的表示

#define MAXSIZE 100//最大长度

typedef struct
{
SElemType *base;//栈底
SElemType *top;//栈顶
int stacksize;//大小
}SqStack;

顺序栈的初始化

Status Initstack(SqStack &S)
{
S.base = new SElemType[MAXSIZE];//分配空间并检查空间是否分配失败
if(!S.base)  return OVERFLOW;//若失败则返回错误
S.top = S.base;//设置栈顶和栈底指针
S.stackSize = MAXSIZE;//设置栈大小
retrun OK;
}

判断顺序栈是否为空

bool StackEmpty(SqStack S)
{
if(S.top == S.base)
	return true;
else
	return false;
}

求顺序栈的长度

int StackLength(SqStack S)
{
return S.top - S.base;
}

清空顺序栈

Status ClearStack(SqStack S)
{
if(S.base)S.top = S.base;
return OK;
}

销毁顺序栈

Status DestroyStack(SqStack &s)
{
if(S.base)
{
	delete S.base;
	S.stacksize = 0;
	S.base = S.top = NULL;
}
return OK;
}

顺序栈进栈

1.判断是否栈满,若满则出错
2.元素e压入栈顶
3.栈顶元素加1

Status Push(SqStack &S,SElemType e)
{
if(S.top - S.base==S.stacksize)//判断栈满
	return ERROR;
*S.top++ = e;//先将e赋给头指针指向的元素,再将头指针+1。
return OK;
}

顺序栈出栈

1.判断是否栈空,若空则出错
2.获取栈顶元素e
3.栈顶指针减1

Status Pop(SqStack &S,SElemType &e)
{
if(S.top == S.base)//判断栈空
	return ERROR;
e = *--S.top;//先将头指针指向的元素赋值给e,再将头指针减去1
return OK;
}

取顺序栈栈顶元素

1.判断是否空栈,若空则返回错误
2.否则通过栈顶指针获取栈顶元素

Status GetTop(SqStack &S,SElemType &e)
{
if(S.top == S.base) return ERROR;
e = *(S.top - 1);
return OK;
}

链栈的具体操作

链栈的表示

栈顶指针即是链表的头指针

typrdef struct StackNode
{
	SElemType data;
	struct StackNode *next;
}StackNode,*LinkStack;
LinkStack S;

链栈的初始化

void InitStack(LinkStack &S)
{
S = NULL;
}

判断链栈是否为空

Status StackEmpty(LinkStack S)
{
if(S==NULL)
	return TRUE;
else
	return FALSE;
}

链栈的进栈

Status Push(LinkStack &S,SElemType e)
{
p = new StackNode;//生成新节点p
if(!p) exit(OVERFLOW);
p->data = e;
p->next = S;
S = p;
return OK;
}

链栈的出栈

Status Pop(LinkStack &S,SElemType &e)
{
if(S==NULL) return ERROR;//判断是否栈空
e = S->data;
p = S;
S = S->next;
delete p;
return OK;
}

取链栈栈顶元素

SElemType GetTop(LInkStack S)
{
if(S == NULL) exit(1);
else
return S->data;
}

队列的操作

顺序队列的基础

空队标志:front == rear;
入队: base[rear++]=x;
出队:x=base[front++];

头文件及宏

#include <iostream>
#include <fstream>
using namespace std;

#define MAXQSIZE	100
#define OK			1
#define ERROR		0
#define OVERFLOW	-1

typedef char QElemType;
typedef char SElemType;
typedef int  Status;

队列的顺序表示

#define M 100 //最大队列长度
Typedef struct{
QElemtype *base; //初始化的动态分配存储空间
int front;		//头指针
int rear;		//尾指针
}SaQueue;

循环队列的具体操作

实现:利用“模”运算
入队:
base[rear]=x;
rear=(rear+1)%M;
出队:
x=base[front];
front=(fornt+1)%M;
判断队空队满:
队空:front = rear;
队满:(rear+1)%M=front;

循环队列的表示

#define M 100 //最大队列长度
Typedef struct{
QElemtype *base; //初始化的动态分配存储空间
int front;		//头指针
int rear;		//尾指针
}SaQueue;

循环队列的初始化

Status InitQueue(SqQueue &Q)
{
Q.base = new QElemType[MAXSIZE]//申请空间
if(!Q.base) exit(OVERFLOW);
Q.front=Q.rear=0;		//队空
return OK;
}

求循环链表的长度

int QueueLength(SqQueue Q)
{
return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}

循环队列入队

Status EnQueue(SqQueue &Q,QElemType e)
{
if((Q.rear+1)%MAXSIZE==Q.front) return ERROR;//队满
Q.base[Q.rear] = e;
Q.rear = (Q.rear+1%MAXQSIZE;
return OK;
}

循环队列出队

Status DeQueue(LinkQueue &Q,QElemType &e)
{
if(Q.front==Q.rear)return ERROR://队空
e = Q.base[Q.front];
Q.front = (Q.front+1)%MAXQSIZE;
return OK;
}

链队列的具体操作

链队列的表示

typedef struct QNode{
QElemType data;
struct Qnode *next;
}Qnode,*QueuePtr;

typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;

链队列的初始化

Status InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode))
if(!Q.front) exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}

销毁链队列

Status InitQueue(LinkQueue &Q)
{
whlie(Q.front){
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;}
return OK;
}

判断链队列是否为空

Status QueueEmpty(LinkQueue Q)
{
return(Q.front==Q.rear);
}

求链队列的队头元素

Status GetHead(LinkQueue Q,QElemType &e)
{
if(Q.front==Q.rear) return ERROR;//队空,无法删除
e = Q.front->next->data;
return OK;
}

链队列入队

Status DeQueue(LinkQueue &Q,QElemType e)
{
p = (QueuePtr)malloc(sizeof(QNode));//分配新节点内存
if(!p)exit(OVERFLOW);
p->data = e;p->next=NULL;
Q.rear->next = p;
Q.rear = p;
return OK;
}

链队列出队

Status DeQueue(LinkQueue &Q,QElemType &e)
{
if(Q.front==Q.rear) return ERROR;//队空,无法删除
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear==p) Q.rear=Q.front;
delete p;
return OK;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用 C 语言实现顺序栈和循环顺序队列的基本操作: 顺序栈的基本操作: 1. 初始化栈:创建一个空栈,并返回该栈的指针。 ``` #include <stdio.h> #include <stdlib.h> #define MaxSize 100 typedef struct Stack { int data[MaxSize]; int top; } Stack; Stack* initStack() { Stack* s = (Stack*)malloc(sizeof(Stack)); s->top = -1; return s; } ``` 2. 判断栈是否为空:如果栈为空,则返回 1,否则返回 0。 ``` int isEmpty(Stack* s) { if (s->top == -1) { return 1; } else { return 0; } } ``` 3. 入栈操作:将元素 x 压入栈顶。 ``` void push(Stack* s, int x) { if (s->top == MaxSize - 1) { printf("Stack is full!\n"); return; } s->data[++s->top] = x; } ``` 4. 出栈操作:弹出栈顶元素,并返回该元素。 ``` int pop(Stack* s) { if (isEmpty(s)) { printf("Stack is empty!\n"); return -1; } return s->data[s->top--]; } ``` 循环顺序队列的基本操作: 1. 初始化队列:创建一个空队列,并返回该队列的指针。 ``` typedef struct Queue { int data[MaxSize]; int front, rear; } Queue; Queue* initQueue() { Queue* q = (Queue*)malloc(sizeof(Queue)); q->front = q->rear = 0; return q; } ``` 2. 判断队列是否为空:如果队列为空,则返回 1,否则返回 0。 ``` int isEmpty(Queue* q) { if (q->front == q->rear) { return 1; } else { return 0; } } ``` 3. 判断队列是否已满:如果队列已满,则返回 1,否则返回 0。 ``` int isFull(Queue* q) { if ((q->rear + 1) % MaxSize == q->front) { return 1; } else { return 0; } } ``` 4. 入队操作:将元素 x 插入队尾。 ``` void enqueue(Queue* q, int x) { if (isFull(q)) { printf("Queue is full!\n"); return; } q->data[q->rear] = x; q->rear = (q->rear + 1) % MaxSize; } ``` 5. 出队操作:将队头元素弹出,并返回该元素。 ``` int dequeue(Queue* q) { if (isEmpty(q)) { printf("Queue is empty!\n"); return -1; } int x = q->data[q->front]; q->front = (q->front + 1) % MaxSize; return x; } ``` 以上是顺序栈和循环顺序队列的基本操作实现。可以通过自己编写测试代码进行验证。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值