数据结构--栈和队列记事本

以下为:栈和队列的基操

顺序队列(循环队列)

#include <bits/stdc++.h>
#define MAXSIZE 100
using namespace std;
typedef struct qnode
{
    int data[MAXSIZE];
    int front,rear;
}Queue;
void InitQueue(Queue &q)//这里一定要有地址符
{
    q.front=0;
    q.rear=0;
}
void InQueue(Queue &q,int data)
{
    if((q.rear+1)%MAXSIZE!=q.front)//不为满
    {
       q.data[q.rear]=data;
       q.rear=(q.rear+1)%MAXSIZE;
    }
}
void OutQueue(Queue &q)
{
    int data;
    if(q.front!=q.rear)//不为空
    {
        data=q.data[q.front];
        q.front=(q.front+1)%MAXSIZE;
    }
    cout<<data<<" ";
}
int main()
{
    int x,data;
    Queue Q;
    InitQueue(Q);
    while(cin>>x&&x!=0)
    {
        InQueue(Q,x);
    }
    while(Q.front!=Q.rear)
    {
        OutQueue(Q);
    }
    //cout<<endl;
    return 0;
}

//取队头
int GetHead(Queue &Q)
{
    return Q.data[Q.front]; 
}
//判空
int QueueEmpty(Queue &Q)
{
    if(Q.front==Q.rear)return 1;
    else return 0;
}

链队列

new和delete配套
malloc和free配套

#include <bits/stdc++.h>
using namespace std;
#define MAXSIZE 100
typedef struct node
{
    int data;
    struct node *next;
}QNode,*LinkQNode;
//封装头尾指针
typedef struct
{
    LinkQNode front,rear;
}Queue;
//初始化:创建带头结点的空队
void InitQueue(Queue &Q)
{
    Q.front=Q.rear=new QNode;//指针申请存储空间
    if(!Q.front)//队头节点为空
    {
        cout<<"Error";
        return 0;
    }
    Q.front->next=NULL;
    return 1}
//入队
void QueueIn(Queue &Q,int x)
{
    LinkQNode p;//指针
    p=new QNode;//申请空间
    p->data=x;
    p->next=NULL;
    //从队尾插入,用尾插法
    Q.rear->next=p;
    Q.rear=p;
}
//出队
int QueueOut(Queue &Q)
{
    int x;
    LinkQNode p;
    if(Q.front!=Q.rear)//不为空
    {
        p=Q.front->next;//由于队列有头结点
        x=p->data;
        Q.front->next=p->next;
        if(Q.rear==p)//仅一个元素
        {
            Q.rear=Q.front;//出队后,队空
        }
        delete(p);
        return x; 
    }
}

//判空
int QueueEmpty(Queue Q)
{
    if(Q.front==Q.rear)return 1;
    else return 0;
}

以下为栈--------------------------------------------------------------------------------------

链栈

#include <bits/stdc++.h>
using namespace std;
#define MAXSIZE 100
typedef struct snode
{
    int data;
    struct sode *next;
}SNode,*LinkStack;
//由于栈只在栈顶操作,因此,通常不设头结点


//初始化:创建空栈,栈顶top
void InitStack(LinkStack &top)
{
    top=NULL;
}
//判栈空
int StackEmpty(LinkStack top)
{
    if(top==NULL)return 1;
    else return 0;
}
//入栈
void StackIn(LinkStack &top,int x)
{
    //栈top头插x,变更新top
    LinkStack s;//指针
    s=new SNode;//申请
    s->data=x;  //存储
    //头插
    s->next=top;
    top=s;
}
//出栈
int StackOut(LinkStack &top)
{
    int x;
    LinkStack P;//指针p
    //出栈前提:栈不为空
    if(top!=NULL)
    {
        x=top->data;
        p=top;
        top=top->next;
        free(p);
        return x;
    }
  
}

顺序栈

#include <bits/stdc++.h>
//顺序栈的输入输出
using namespace std;
#define MAXSIZE 10000
typedef struct
{
    int top;
    int bottom;
    int data[MAXSIZE];
}Stack;

void InitStack(Stack &s)//初始化
{
    s.bottom=0;
    s.top=0;
    memset(s.data,0,sizeof(s.data));
}

int StackPop(Stack &s)//出栈
{
    if(s.bottom!=s.top){
        s.top--;
    return s.data[s.top+1];
    }
}

void StackPush(Stack &s,int x)//入栈
{
    s.top++;
    s.data[s.top]=x;
}
int main()
{
    Stack s;
    InitStack(s);
    int data;
    while(cin>>data&&data!=0)  //输入
        StackPush(s,data);
    while(s.bottom!=s.top)    //输出
        cout<<StackPop(s)<<" ";
   // cout << "Hello world!" << endl;
    return 0;
}

顺序栈(双向栈)

在这里插入图片描述

在这里未完
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值