数据结构——栈和队列

栈和队列

栈(顺序存储)
定义栈
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct
{
    int data[MaxSize];//静态数组存放栈中元素
    int top;//栈顶指针
} SqStack;

void testStack()
{
    SqStack S;//声明一个顺序栈(分配空间)
}
初始化栈
//初始化栈
void InitStack(SqStack *S)
{
    S->top=-1;//初始化栈顶指针
}

判断栈空
//判断栈空
bool StackEmpty(SqStack S)
{
    if(S.top==-1) //栈空
        return true;
    else
        return false; //不空
}
入栈
//新元素入栈
bool Push(SqStack *S,int x)
{
    if(S->top==MaxSize-1) //栈满,报错
        return false;
    S->top =S->top+1;//指针先加1
    S->data[S->top]=x;//新元素入栈
    return true;
}
出栈
//出栈操作
bool Pop(SqStack *S,int *x)
{
    if(S->top==-1) //栈空,报错
        return false;
    x=S->data[S->top];//栈顶元素先出栈
    S->top=S->top-1;//指针再减1
    return true;
}
读取栈顶元素
//读取栈顶元素
bool GetTop(SqStack S,int *x)
{
    if(S.top==-1) //栈空,报错
        return false;
    x=S.data[S.top]; //x记录栈顶元素
    return true;
}
共享栈
//共享栈
typedef struct 
{
    int data[MaxSize];//静态数组存放栈中元素
    int top0;//0号栈栈顶指针
    int top1;//1号栈栈顶指针
}ShStack;
//初始化栈
void InitShStack(ShStack *S)
{
    S->top0=-1; //初始化栈顶指针
    S->top1=MaxSize;
}
栈(链式存储)
//链栈
typedef struct Linknode
{
    int data;//数据域
    struct Linknode *next;//指针域
} *LiStack;//栈类型定义
队列(顺序存储)
定义队列
#define MaxSize 10//定义队列中元素的最大个数
typedef struct
{
    int data[MaxSize];//用静态数组存放队列元素
    int front,rear;//队头指针和队尾指针
} SqQueue;
初始化队列
//初始化队列
void InitQueue(SqQueue *Q)
{
    //初始时、队头、队尾指针指向0
    Q->rear=Q->front=0;
}
void testQueue()
{
    SqQueue Q;//声明一个队列
    InitQueue(&Q);
}

判断队列是否为空
//判断队列是否为空
bool QueueEmpty(SqQueue Q)
{
    if(Q.rear=Q.front) //队空条件
        return true;
    else
        return false;
}
入队操作
//入队操作
bool EnQueue(SqQueue *Q,int x)
{   
    if((Q->rear+1)%MaxSize==Q->front) //队列已满,报错
        return false;
    Q->data[Q->rear]=x;//将x插入队尾
    Q->rear=(Q->rear+1)%MaxSize;//队尾指针加1取模
    return true;
}
出队操作
//出队操作
bool DeQueue(SqQueue *Q,int *x)
{
    if(Q->rear==Q->front)
        return false;//队空则报错
    x=Q->data[Q->front];
    Q->front=(Q->front+1)%MaxSize;
    return true;
}
获取队头
//获取队头
bool GetHead(SqQueue Q,int *x)
{
    if(Q.rear==Q.front)
        return false;//队空则报错
    x=Q.data[.front];
    return true;
}
队列(链式存储)
定义队列
typedef struct LinkNode
{
    //链式队列结点
    int data;
    struct LinkNode *next;
} LinkNode;

typedef struct
{
    //链式队列
    LinkNode *front,*rear; //队列的队头指针和队尾指针
} LinkQueue;

初始化队列
// 初始化队列(带头结点)
void InitQueue(LinkQueue *Q)
{
    //初始时 front、rear都指向头结点
    Q->front=Q->rear=(LinkNode *)malloc(sizeof(LinkNode));
    Q->front->next=NULL;
}
// 初始化队列(不带头结点)
void InitNoHeadQueue(LinkQueue *Q)
{
    //初始时 front、rear都指向NULL
    Q->front=NULL;
    Q->rear=NULL;
}
void testLinkQueue()
{
    LinkQueue Q; //声明一个队列
    InitQueue(&Q); //初始化队列
}

判断队列是否为空
//判断队列是否为空(带头结点)
bool IsEmpty(LinkQueue Q)
{
    if(Q.front==Q.rear)
        return true;
    else
        return false;
}
//判断队列是否为空(带头结点)
bool IsNoHeadEmpty(LinkQueue Q)
{
    if(Q.front==NULL)
        return true;
    else
        return false;
}
入队操作
//新元素入队(带头结点)
void EnQueue(LinkQueue *Q,int x)
{


    LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
    s->data=x;
    s->next=NULL;
    Q->rear->next=s;//新结点插入到rear之后
    Q->rear=s;//修改表尾指针
}
//新元素入队(不带头结点)
void EnNoHeadQueue(LinkQueue *Q,int x)
{
    LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
    s->data=x;
    s->next=NULL;
    if(Q->front==NULL)
    {
        Q->front=s;
        Q->rear=s;
    }
    else
    {
        Q->rear->next=s;//新结点插入到rear之后
        Q->rear=s;//修改表尾指针
    }

}
出队操作
//队头元素出队(带头结点)
bool DeQueue(LinkQueue *Q,int *x)
{
    if(Q->front==Q->rear)
        return false;//空队
    LinkNode *p =Q->front->next;
    x=p->data;//用变量x返回队头元素
    Q->front->next=p->next;//修改头结点的next指针
    if(Q->rear==p)//此次是最后一个结点出队
        Q->rear=Q->front;//修改rear指针
    free(p);//释放结点空间
    return true;
}
//队头元素出队(不带头结点)
bool DeNoHeadQueue(LinkQueue *Q,int *x)
{
    if(Q->front==NULL)
        return false;//空队
    LinkNode *p =Q->front;//p指向此次出队结点
    x=p->data;//用变量x返回队头元素
    Q->front=p->next;//修改front指针
    if(Q->rear==p)//此次是最后一个结点出队
        Q->rear=NULL;//front指向NULL
        Q->front=NULL;//rear指向NULL
    free(p);//释放结点空间
    return true;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值