堆栈队列基本操作

顺序栈基本操作

文件声明

#include<stdio.h>
#include<stdlib.h>

#define MaxSize 50

//顺序栈定义
typedef struct{
    int data[MaxSize];  //存放栈中元素
    int top;            //栈顶指针
} SqStack;

//链栈定义
typedef struct Linknode{
    int data;
    struct Linknode *next;
}*LiStack;

栈的初始化

//栈的初始化
void InitStack(SqStack &S){
    S.top =  -1;        //初始化栈顶指针
}

判断栈是否为空

//判断栈是否为空
bool StackEmpty(SqStack S){
    if(S.top == -1){
        return true;    //栈为空返回true
    }
    else return false;  //栈非空,返回false
}

进栈

//进栈
bool Push(SqStack &S, int x){
    if(S.top = MaxSize - 1){
        return true;
    }
    else{
        S.data[++S.top] = x;    //指针+1,然后进栈
    }
}

出栈

bool Pop(SqStack &S, int &x){
    if(S.top == -1){
        return false;
    }
    else{
        x = S.data[S.top--];    //出栈后,指针减1
        return true;
    }
}

读栈顶元素

//读栈顶元素
bool GetTop(SqStack S, int &x){
    if(S.top == -1){
        return false;
    }
    else{
        x = S.data[S.top];
    }
}

循环队列基本操作

前面文件声明

#include<stdio.h>
#include<stdlib.h>

#define MaxSize 50
//队列的顺序存储
typedef struct 
{
    int data[MaxSize];      //存放队列元素
    //队头指针允许删除,队尾指针允许插入
    int front, rear;        //队头指针和队尾指针
}SeQueue;

判断队空,队满

//顺序队列容易出现假溢出的情况,所以采用循环队列
/*循环队列区分队列满还是空

    1、牺牲一个存储单元
    2、结构体中增加一个数据元素size,存储队列中元素个数
    3、类型中,增加tag,tag=0,为空。若因删除导致队头和队尾相同,则为队空,若因插入导致队头与队尾相同,则为队蛮
*/

初始化

//初始化
void InitQueue(SeQueue &Q){
    Q.rear = Q.front = 0;
}

判断队是否为空

//判队空
bool isEmpty(SeQueue Q){
    if(Q.rear == Q.front) return true;
    else return false;
}

入队

//入队
bool EnQueue(SeQueue &Q, int x){
    //队满报错
    if((Q.rear+1)%MaxSize == Q.front){
        return false;
    }
    Q.data[Q.rear] = x;
    //队尾指针加1取模
    Q.rear = (Q.rear+1)%MaxSize;
    return true;
}

出队

//出队
bool Deqeue(SeQueue &Q,int &x){
    if(Q.rear == Q.front)  return false;
    x = Q.data[Q.front];
    Q.front = (Q.front+1)%MaxSize;
    return true;
}

链栈基本操作

前面文件声明

#include<stdio.h>
#include<stdlib.h>

#define MaxSize 50

//队列的链式存储,采用带头结点
typedef struct LinkNode{
    int data;
    struct LinkNode *next;
}LinkNode;
typedef struct{
    LinkNode *front,*rear;      //存放队列的队头和队尾
}LinkQueue;

链队的初始化

//链的初始化
void InitQueue(LinkQueue &Q){
    Q.front=Q.rear=(LinkNode *)malloc(sizeof(LinkNode));        //建立头结点
    Q.front->next = NULL;                                       //初始为空
}

判断队是否为空

//判队空
bool IsEmpty(LinkQueue Q){
    if(Q.front == Q.rear) return true;
    else return false;
}

入队

//入队
void EnQueue(LinkQueue &Q, int x){
    LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
    //把节点插到队尾,然后移动队尾到s
    s->data = x;
    s -> next = Q.rear->next;
    Q.rear -> next = s;
    Q.rear = s;
}

出队

//出队
bool DeQueue(LinkQueue &Q, int &x){
    if(Q.front == Q.rear)  return false;        //如果队为空,报错
    //这里采用带头结点的链表,所以需要找到下一个节点,才是带值节点
    LinkNode *p = Q.front->next;
    x = p->data;
    Q.front ->next = p->next;
    if(Q.rear == p){
        Q.rear = Q.front;      //如果原始队列中,只有一个元素,删除后变为空
    }
    free(p);
    return true;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值