栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

栈与队列简单代码---(顺序栈、链栈、两栈共享空间、循环队列、链队列)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

栈与队列简单代码---(顺序栈、链栈、两栈共享空间、循环队列、链队列)

蠢蠢新手代码有需要的可以参考一下

顺序栈

//顺序栈入栈出栈
#include
#include
#define Max 100

typedef struct stack{
    int data[Max];
    int top;
}Sqstack;

//初始化
int Init(Sqstack *s){
    s->top=(Sqstack *)malloc(Max*sizeof(Sqstack));
    s->top=0;
    return 1;
}   

//入栈
int Push(Sqstack *s, int i){
    if(s->top==Max-1)       //栈满
        return 0;
    s->data[++s->top]=i;    //在栈顶放元素
    return 1;
}

//出栈
int Pop(Sqstack *s, int *e){
    if(s->top==-1)     //栈空
        return 0;
    *e=s->data[s->top--];     //top下移

    return 1;
}

//遍历
int Traverse(Sqstack *s){
    int i=0;
    while(i++top){
        printf("%d ",s->data[i]);
    }
    printf("n");

    return 1;
}

int main(){
    Sqstack *s;
    Init(s);

    int n,e;

    printf("输入添加栈元素的个数:n");
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        Push(s,i);
    }
    Traverse(s);
    Pop(s,&e);
    printf("出栈掉的元素是:%dn",e);
    Traverse(s);
    return 0;
}

链栈

//链栈入栈出栈 
#include
#include

typedef int ElemType;
typedef struct stacknode{
    ElemType data;
    struct stacknode *next;
}linkNode;      //操作数据

typedef struct{
    linkNode *top;
    int Length;
}linkStack;     //操作栈头

//初始化创建
int Init(linkStack *p){
    p->top=(linkNode *)malloc(sizeof(linkNode));        //为top申请一个data.next域的结点
    p->top=NULL;
    p->Length=0;

    return 1;
}

//空
int StackEmpty(linkStack St){
    if(St.Length==0){
        return 1;
    }
    else{
        return 0;
    }
        
}

//入栈
int Push(linkStack *St, ElemType e){
    linkNode *s;
    s=(linkNode *)malloc(sizeof(linkNode));
    s->data=e;
    s->next=St->top;
    St->top=s;
    St->Length++;
    return 1;
}

//弹出
int Pop(linkStack *St, ElemType *e){
    linkNode *t;
    if(StackEmpty(*St)){        //不为空就表示if无效
        return 0;
    }
    *e=St->top->data;
    t=St->top;
    St->top=St->top->next;
    free(t);
    St->Length--;

    return 1;
 
}

//遍历
int Traverse(linkStack *St){
    linkNode *st;
    st=St->top;
    while(st){
        printf("%d ",st->data);
        st=st->next;
    }
    printf("n");

    return 1;
}



int main(){
    linkStack *L;
    ElemType e;
    Init(L);
    for(int i=1;i<=5;i++){
        Push(L,i);
    }
    Traverse(L);
    Pop(L,&e);
    printf("出掉的栈头是:%dn",e);
    Traverse(L);

    return 0;
}

两栈共享空间

//两栈共享空间
#include
#include
#define Max 10

typedef struct{
    int data[Max];
    int top1;
    int top2;
}Dustack;

//初始化
int Init(Dustack *s){
    s->top1=-1;
    s->top2=Max;

    return 1;
}

//入栈
int Push(Dustack *s, int i, int stackNum){
    if(s->top1+1==s->top2)      //栈满
        return 0;
    if(stackNum==1)
        s->data[++s->top1]=i;      //栈1从前面添加
    else if(stackNum==2)
        s->data[--s->top2]=i;       //栈2从后面添加

    return 1;
}

//出栈
int Pop(Dustack *s, int stackNum, int *e){
    if(stackNum==1){
        if(s->top1==-1)     //栈1不为空
            return 0;
        *e=s->data[s->top1--];  //出栈1的栈顶
    }else if(stackNum==2){
        if(s->top2==Max)    //栈2不为空
            return 0;
        *e=s->data[s->top2++];  //出栈2的栈顶
    }
    return 1;
}

//遍历
int Traverse(Dustack s){
    int i=0;
    printf("表:");      //分别输出栈1和栈2
    while(i<=s.top1){
        printf("%d ",s.data[i++]);
    }
    while(s.top2 

循环队列

//循环队列
//循环也是就说%Max让它回到前面
#include
#include
#define Max 5

typedef struct{
    int data[Max];   
    int front;
    int rear;
}SqQueue;

//初始化
int InitQueue(SqQueue *Q){
    Q->front=0;
    Q->rear=0;
    return 1;
}

//长度
int QueueLength(SqQueue *Q){
    return (Q->rear - Q->front+Max)%Max;
}

//入列
int EnQueue(SqQueue *Q, int e){
    if((Q->rear+1)%Max==Q->front)       //栈满,留一个位置
        return 0;
    Q->data[Q->rear]=e;
    Q->rear=(Q->rear+1)%Max;        //不为满的情况下自由移动
    
    return 1;
}

//出列
int DeQueue(SqQueue *Q, int *e){
    if(Q->front==Q->rear)               //栈空
        return 0;
    *e=Q->data[Q->front];
    Q->front=(Q->front+1)%Max;      //不为空的情况下自由移动

    return 1;
}

//遍历
int Traverse(SqQueue *Q){
    SqQueue *q=Q;
    int i=q->front;         //遍历的条件跟判断栈空的条件是一样的,不过这里用了i
    while(i!=q->rear){      //因为判断栈满所以少了一个空间
        printf("%d ",q->data[i]);
        i=(i+1)%Max;
    }
    printf("n");
}


int main(){
    SqQueue *Q;
    int e;
    InitQueue(Q);
    for(int i=1 ;i<=Max;i++){
        EnQueue(Q,i);
    }
    Traverse(Q);
    DeQueue(Q,&e);
    printf("出栈的元素是:%dn",e);
    Traverse(Q);

    return 0;
}


链队列

//链栈
#include
#include

typedef int ElemType;
typedef struct node{
    ElemType data;
    struct node *next;
}linkNode;

typedef struct{
    linkNode *front,*rear;
}linkQueue;

//初始化创建
int InitQueue(linkQueue *Q){
    linkNode *head;
    head=(linkNode *)malloc(sizeof(linkNode));
    Q->front=Q->rear=head;
    
    return 1;
}

//入列
int EnQueue(linkQueue *Q, ElemType e){
    linkNode *q;
    q=(linkNode *)malloc(sizeof(linkNode));
    q->data=e;
    q->next=NULL;
    Q->rear->next=q;            //和尾插法差不多
    Q->rear=q;

    return 1;
}

//出列
int DeQueue(linkQueue *Q, ElemType *e){
    linkNode *q;
    if(Q->front==Q->rear)           //判空,判满就不必了因为是链式结构
        return 0;
    q=Q->front->next;
    *e=q->data;
    Q->front->next=q->next;     //和链表删除没有区别
    if(Q->rear=q)           //若队头是队尾,删除后将rear指向头结点
        Q->rear=Q->front;
    free(q);


    return 1;
}
//遍历
int Traverse(linkQueue *Q){
    linkNode *q;
    q=Q->front->next;       //头结点哦!
    while(q){
        printf("%d ",q->data);
        q=q->next;
    } 
    printf("n");

    return 1;
}


int main(){
    linkQueue *Q;
    ElemType e;
    InitQueue(Q);
    for(int i=1;i<=5;i++){
        EnQueue(Q,i);
    }
    Traverse(Q);
    DeQueue(Q,&e);
    printf("出列的栈头是:%dn",e);
    Traverse(Q);

    return 0;
}

END
.
.
.
.
.
.
.
.
.
.

头发发我的头发啊啊啊!!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/296706.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号