首页 > 其他 > 详细

cpp数据结构1——栈和队列

时间:2020-05-18 21:07:27      阅读:46      评论:0      收藏:0      [点我收藏+]

栈:后进先出

struct Stack{
 ElemType data[MaxSize];
 int top;
};
 
技术分享图片1-1栈的基本操作

以下是利用栈判断回文序列

技术分享图片
boolsymmetry(inta[],intl){inti,e;Stack*s;InitStack(s);for(i=0;i<l;i++){Push(s,a[i]);}for(i=0;i<l;i++){Pop(s,e);if(a[i]!=e){DestroyStack(s);returnfalse;}}DestroyStack(s);returntrue;}intmain(){inta[]={1,2,3,2,1};cout<<symmetry(a,5);}
1-2回文

我们也可以利用链式存储完成栈的构建

技术分享图片
#include <iostream>
#include <stdlib.h>
using namespace std;


struct Stack//Struct Link
{
    int data;
    Stack *next;
};


void InitStack(Stack *&s)
{
    s = NULL;
}


void DestroyStack(Stack *&s)
{
    if(s==NULL){
        return;
    }
    Stack *p=s,*q=s->next;
    while(q){
        free(p);
        p=q;
        q=q->next;
    }
    free(p);
}


bool StackEmpty(Stack *s)
{
    return(s==NULL);
}//判断栈是否为空
 

void Push(Stack *&s,int e)//这里不是bool是因为链式存储一般不需要考虑栈满的情况 
{
    if(s==NULL){
        s=new Stack;
        s->next=NULL;
        s->data=e;
        return;
    }
    Stack *p=s;
    for(;p->next;p=p->next);
    p->next=new Stack;
    p=p->next;
    p->data=e;
    p->next=NULL;
}//栈的操作只操作最后放入的元素,如果将后来的元素放在队尾部,会给后续操作带来不便
//如果只需要进行栈操作的话,入栈建议将数据放在头部 
void Push2(Stack *&s,int e)
{
    if(s==NULL){
        s=new Stack;
        s->next=NULL;
        s->data=e;
        return;
    }
    Stack *p=new Stack;
    p->next=s;
    p->data=e;
    s=p;
}


bool Pop(Stack *&s,int &e)
{
    if(s==NULL)return false;
    e=s->data;
    Stack *p=s;
    s=s->next;
    free(p);
    return true;
}


bool GetTop(Stack *&s,int &e)
{
    if(s==NULL)return false;
    e=s->data;
    return true;
}
2链栈

队列:先进先出

技术分享图片

 

 (来源:mooc——数据结构——武汉大学)

队列需要有队首和队尾两个指针,其它基本操作的实现都可参考栈

将基础操作的rear++和front++改为

rear=(rear+1)%MaxSize和front=(front+1)%MaxSize
并约定rear=front为队空(初始)条件
(rear+1)%MaxSize=front为队满条件
 
 
 
对于环形队列来说,如果知道队头指针和队列中元素个数,则可以计算出队尾指针。也就是说,可以用队列中元素个数代替队尾指针。
 
技术分享图片
#include <stdlib.h>
struct Queue
{
    int data[5];
    int front;
    int len;
};


void InitStack(Queue *&s)
{
    s=new Queue;
    s->front=0;
    s->len=0;
}


void DestroyStack(Queue *&s)
{
    free(s);
}


bool StackEmpty(Queue *s)
{
    return(s->len==0);
}
 

bool enQueue(Queue *&s,int e)
{
    if(len==5)return false;
    s->data[(s->front+s->len)%5]=e;
    len++;
    return true;
}


bool deQueue(Stack *&s,int &e)
{
    if(len==0)return false;
    e=s->data[s->front];
    s->front=(s->front+1)%5;
    return true;
}
3环形队列(用长度代替队尾指针)

 

 

cpp数据结构1——栈和队列

原文:https://www.cnblogs.com/applerun/p/12912848.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!