Leap Day9——数据结构与算法 栈和队列具体操作练习实验

目录

1、顺序栈

1.1 顺序栈的表示

1.2 顺序栈的初始化

1.3 顺序栈判断栈是否为空

1.4 求顺序栈长度

1.5 清空顺序栈

1.6 销毁顺序栈

1.7 顺序栈的入栈

1.8 顺序栈的出栈

2、链栈

2.1 链栈的定义

2.2 链栈的初始化

2.3 判断链栈是否为空

2.4 链栈的入栈

2.5 链栈的出栈

2.6 取栈顶元素

3、顺序循环队列

3.1 循环队列的初始化

3.2 求循环队列的长度

3.3 循环队列 入队

3.4 循环队列 出队

3.5 顺序队列取队头元素

4、链队

4.1 链队的类型定义

4.2 链队列初始化

4.3 销毁链队列

4.4 将元素e入队

4.5 链队列出队

4.6 求链队列的队头元素


1、顺序栈

1.1 顺序栈的表示

#define MAXSIZE 100
typedef struct{
    SElemType *base//栈底元素
    SELemType *top//栈顶元素
    int stacksize//栈可用最大内存
}SqStack

1.2 顺序栈的初始化

Status InitStack(SqStack &S){//构造一个空栈
    S.base = new SElemType[MAXSIZE];
    //S.base = (SELemType*)malloc(MAXSIZE*sizeof(SElemType));
    if(!S.base)exit (OVERFLOW);//存储分配失败
    S.top = S.base;
    S.stacksize = MAXSIZE;
    return OK;
}

1.3 顺序栈判断栈是否为空

Status StackEmpty(SqStack S){
    if(S.top == S.base)
        return TRUE;
    else
        return FALSE
}

1.4 求顺序栈长度

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

1.5 清空顺序栈

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

1.6 销毁顺序栈

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

1.7 顺序栈的入栈

Status Push(SqStack &S,SElemType e){
    if(S.top - S.base == S.stacksize)//栈满
        return ERROR;
    *S.top = e;
    S.top++;
    //*S.top++ = e;
    return Ok;
}

1.8 顺序栈的出栈

Status Pop(SqStack &S,SElemType e){
    if(S.top == S.base)//栈空
        return ERROR;
    --S.top;
    e=*S.top;
    //e = *--S.top;
    return Ok;
}

2、链栈

2.1 链栈的定义

typedef struct StcakNode{
    SelemType data;
    struct StcakNode *next;
}StackNode,*LInkStack;
LinkStack S;

2.2 链栈的初始化

void InitStack(LinkStack &S){
    //构造一个空栈,栈顶指针置空
    S = NULL;
    return OK;
}

2.3 判断链栈是否为空

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

2.4 链栈的入栈

Status Push(LinkStack &S,SElemType e){
    p = new StackNode   //生成新结点P
    p->data = e;        //将新结点数据域置为e
    p->next = s;        //将新结点插入栈顶
    S=p;               //修改栈顶指针
    return OK;
}

2.5 链栈的出栈

Status Push(LinkStack &S,SElemType &e){
    if(S == NULL)
        return ERROR;
    e = S->data;
    p = S;
    S = S->next;
    delete p;
    return OK;
}

2.6 取栈顶元素

Status Push(LinkStack &S,SElemType &e){
    if(S != NULL)
        return S->data;
}

3、顺序循环队列

3.1 循环队列的初始化

Status InitQueue (SqQueue &Q){
    Q.base = new QElemType[MAXQSIZE];//分配数组空间
    if(!Q.base) exit(OVERFLOW); //存储配置失败
    Q.front = Q.rear = 0;   //头尾指针置为0,队列位空
    return OK;
}

3.2 求循环队列的长度

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

3.3 循环队列 入队

Status EnQueue (SqQueue &Q,QElemType e){
    if((Q.rear+1)%MAXQSIZE == Q.front)  return ERROR;//队满
    Q.base[Q.rear] =x;//插入元素放在尾指针指向的位置
    Q.rear = (Q.rear + 1) % MAXSIZE //队尾指针加一
}

3.4 循环队列 出队

Status DeQueue (SqQueue &Q,QElemType &e){
    if(Q.rear == Q.front)   return ERROR;//队空
    x = Q.base[Q.front];//头指针指向的元素赋值给x
    Q.front = (Q.front + 1) % MAXSIZE
}

3.5 顺序队列取队头元素

SElemType GetHead(SqQuere Q){
    if(Q.front != Q.rear)//队列不为空
    return  Q.base[Q.front];//返回队头指针元素的值,队头指针不变
}


4、链队

4.1 链队的类型定义

#define MAXSIZE 100//最大队列长度
typedef struct Qnode{
    QElemType data;
    struct Qnode *next;
}QNode,*QuenePtr;

typedef struct{
    QuenePtr front;//队头指针
    QuenePtr rear;//队尾指针
}LinkQueue;

4.2 链队列初始化

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

4.3 销毁链队列

Status DestroyQueue(LinkQueue &Q){
    while(Q.front){
        p=Q.front->next;
        free(Q.front);
        Q.front=p;
    }
}

4.4 将元素e入队

Status EnQueue(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;//将p作为尾指针
    return OK;
}

4.5 链队列出队

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; 
}

4.6 求链队列的队头元素

Status GetHead(LinkQueue Q,QElemType &e){
    if(Q.front ==Q.rear) return ERROR;
    e=Q>front->next->data;
    return OK;
}
​

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖虎不秃头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值