【数据结构与算法】栈与队列

发布于:2022-11-06 ⋅ 阅读:(476) ⋅ 点赞:(0)

目录

——栈 

1. 栈的基本操作

2. 栈的应用-数制转换 

3. 函数:判断表达式括弧是否匹配 

——队列 

4. 顺序循环队列的基本操作 

5. 链队列基本操作 


——栈 

1. 栈的基本操作

【问题描述】

设一个顺序栈,进行出栈和入栈操作。
【输入形式】

输入若干个整数(不超过1000),依次入栈;(提示:scanf("%d",&e)==1来作为输入判断)
【输出形式】

依次出栈并输出元素值,以空格分隔。
【样例输入】

23 45 67 14 -9 20 100 89 45 30
【样例输出】

30 45 89 100 20 -9 14 67 45 23
【评分标准】

必须使用顺序栈结构实现。栈的基本操作以算法函数形式实现。 

#include<stdio.h>
#include<malloc.h>
#define MAX 10
#define IN 10
typedef struct Stack{
    int *base;
    int *top;
    int size;
}Stack,*PStack;
int Init(PStack S){
    S->base=(int *)malloc(sizeof(int)*MAX);
    S->top=S->base;
    S->size=MAX;
}
int Push(PStack S,int e){
    if(S->top-S->base>=S->size){
        S->base=(int *)realloc(S->base,(S->size+IN)*sizeof(int));
        S->top=S->base+S->size;
        S->size+=IN;
    }
    *S->top++=e;
    return 1;
}
int Pop(PStack S,int *e){
    if(S->base==S->top){
        return 0;
    }
    S->top--;
    *e=*S->top;
    return 1;
}
int Empty(PStack S){
    if(S->base==S->top) return 1;
    else return 0;
}
int main(){
    Stack S;
    int e;
    Init(&S);
    while(scanf("%d",&e)==1){
        Push(&S,e);
    }
    while(!Empty(&S)){
        Pop(&S,&e);
        printf("%d ",e);
    }
    return 0;

2. 栈的应用-数制转换 

【问题描述】

利用栈实现十进制向二进制的转换。

【输入形式】

输入若干个十进制正整数,输出它们的二进制形式。(提示:输入采用scanf("%d",&x)==1)

【输出形式】

输出每个十进制正整数的二进制形式。

【样例输入】

5

7

20

255

128

127

1000

50000

65535

【样例输出】

101

111

10100

11111111

10000000

1111111

1111101000

1100001101010000

1111111111111111

【评分标准】

利用栈的基本操作实现转换。

#include<stdio.h>
#include<malloc.h>
#define MAX 10
#define IN 10
typedef struct Stack{
    int *base;
    int *top;
    int size;
}Stack,*PStack;
int Init(PStack S){
    S->base=(int *)malloc(sizeof(int)*MAX);
    S->top=S->base;
    S->size=MAX;
    return 1;
}
int Push(PStack S,int e){
    while(S->top-S->base>=S->size){
        S->base=(int *)realloc(S->base,sizeof(int)*(S->size+IN));
        S->top=S->base+S->size;
        S->size+=IN;
    }
    *S->top++=e;
    return 1;
}
int Pop(PStack S,int *e){
    if(S->base==S->top){
        return 0;
    }
    S->top--;
    *e=*S->top;
    return 1;
}
int Empty(PStack S){
    if(S->base==S->top) return 1;
    else return 0;
}
int Convert(PStack S,int x){
    int e;
    while(x){
        Push(S,x%2);
        x/=2;
    }
    while(!Empty(S)){
        Pop(S,&e);
        printf("%d",e);
    }
    printf("\n");
    return 1;
}
int main(){
    int x;
    Stack S;
    while(scanf("%d",&x)==1){
        Init(&S);
        Convert(&S,x);
    }
    return 0;

3. 函数:判断表达式括弧是否匹配 

【问题描述】编写算法函数:判断一表达式中的括号是否配对,包括中括号[]、小括号()两种类型。

【输入形式】输入一个只包含中括号和小括号的字符串。

【输出形式】输出匹配结果:若匹配,输出match,如输入“[()][()()]()”,输出“match”;不匹配,输出not match,如输入“[](()]”,输出“not match”。

【样例输入】

[()][()()]()

【样例输出】

match

【样例说明】检测数据包括多种。 

#include<stdio.h>
#include<malloc.h>
#define MAX 10
#define IN 10
typedef struct Stack{
    char *base;
    char *top;
    int size;
}Stack,*PStack;
int Init(PStack S){
    S->base=(char *)malloc(sizeof(char)*MAX);
    S->top=S->base;
    S->size=MAX;
    return 1;
}
int Push(PStack S,char e){
    while(S->top-S->base>=S->size){
        S->base=(char *)realloc(S->base,(S->size+IN)*sizeof(char));
        S->top=S->base+S->size;
        S->size+=IN;
    }
    *S->top++=e;
    return 1;
}
int Pop(PStack S,char *e){
    if(S->base==S->top){
        return 0;
    }
    S->top--;
    *e=*S->top;
    return 1;
}
int Get(PStack S,char *e){
    if(S->base==S->top){
        return 0;
    }
    *e=*(S->top-1);
}
int Empty(PStack S){
    if(S->base==S->top) return 1;
    else return 0;
}
int Measure(PStack S,char *s){
    char e;
    while(*s){
        if(*s=='('||*s=='['){
            Push(S,*s);
        }else{
            if(Empty(S)) return 0;
            Pop(S,&e);
            if(*s==')'){
                if(e!='(') return 0;
            }else{
                if(e!='[') return 0;
            }
        }
        s++;
    }
    if(!Empty(S)) return 0;
    return 1; 
}
int main(){
    char s[100];
    Stack S;
    Init(&S);
    scanf("%s",&s);
    if(Measure(&S,s)==1) printf("match\n");
    else printf("not match\n");
    return 0;

——队列 

4. 顺序循环队列的基本操作 

【问题描述】

实现循环队列的基本操作。(循环队列最大长度不超过20)

【输入形式】

输入若干个整数(以空格分隔,非整数结束输入),其中0表示做出队操作,不为0的整数为入队元素。

【输出形式】

若出队错误输出“error”;

若最后队列为空,则输出“empty”;

若最后队列非空,依次输出队列的全部元素。

【样例输入1】

1 0 2 0 0 3 0 0 0 a

【样例输出1】

error

【样例输入2】

1 0 2 0 3 0 a

【样例输出2】

empty

【样例输入3】

1 2 3 0 0 4 0 5 a

【样例输出3】

4 5

【评分标准】

补充代码完成程序功能,不得修改程序中其他函数。 

#include<stdio.h>
#include<malloc.h>
#define MAX 10
typedef struct Queue{
    int *base;
    int front;
    int rear;
}Queue,*PQueue;
int Init(PQueue Q){
    Q->base=(int *)malloc(sizeof(int)*MAX);
    Q->front=Q->rear=0;
    return 1;
}
int En(PQueue Q,int e){
    if((Q->rear+1)%MAX==Q->front){
        return 0;
    }
    Q->base[Q->rear]=e;
    Q->rear=(Q->rear+1)%MAX;
    return 1;
}
int De(PQueue Q,int *e){
    if(Q->front==Q->rear) return 0;
    *e=Q->base[Q->front];
    Q->front=(Q->front+1)%MAX;
    return 1;
}
int Empty(PQueue Q){
    if(Q->front==Q->rear) return 1;
    else return 0;
}
int main(){
    int e,t;
    Queue Q;
    Init(&Q);
    while(scanf("%d",&e)==1){
        if(e!=0) En(&Q,e);
        else De(&Q,&t);
    }
    if(Empty(&Q)) printf("empty\n");
    else{
        while(!Empty(&Q)){
            De(&Q,&t);
            printf("%d ",t);
        }
    }
    return 0;

5. 链队列基本操作 

【问题描述】

使用带头结点的单链表实现队列,完成该队列的入队、出队、判断队空操作。

【输入形式】

输入若干个整数(以空格分隔),其中0表示做出队操作,不为0的整数为入队元素。

【输出形式】

依次输出队列的全部元素,若队列为空,则输出“empty”

【样例输入1】

1 2 3 4 5 6
【样例输出1】

1 2 3 4 5 6

【样例输入2】

1 2 3 0 0 4 0 5
【样例输出2】

4 5

【样例输入3】

1 0 2 0 3 0
【样例输出3】

empty

【样例输入4】

1 0 2 0 0 3 0 0 0
【样例输出4】

empty

【评分标准】

填充函数,实现队列的基本操作,不得增加其他函数。 

#include<stdio.h>
#include<malloc.h>
typedef struct Node{
    int base;
    struct Node *next;
}Node,*PNode;
typedef struct Queue{
    Node *front,*rear;
}Queue,*PQueue;
int Init(PQueue Q){
    PNode p=(PNode)malloc(sizeof(Node));
    p->next=NULL;
    Q->front=Q->rear=p;
    return 1;
}
int En(PQueue Q,int e){
    PNode q=(PNode)malloc(sizeof(Node));
    q->next=NULL;
    q->base=e;
    Q->rear->next=q;
    Q->rear=q;
    return 1;
}
int Empty(PQueue Q){
    if(Q->front==Q->rear) return 1;
    else return 0;
}
int De(PQueue Q,int *e){
    PNode p;
    p=Q->front->next;
    if(Empty(Q)) return 0;
    *e=p->base;
    if(Q->front->next==Q->rear){
        Q->front->next=NULL;
        Q->rear=Q->front;
    }else{
        Q->front->next=p->next;
        free(p);
    }
    return 1;
}
int main(){
    Queue Q;
    Init(&Q);
    int e;
    while(scanf("%d",&e)==1){
        if(e) En(&Q,e);
        else De(&Q,&e);
    }
    if(Empty(&Q)) printf("empty\n");
    else{
        while(!Empty(&Q)){
            De(&Q,&e);
            printf("%d ",e);
        }
    }
    return 0;


网站公告

今日签到

点亮在社区的每一天
去签到