顺序栈、链队列存储结构的实现

要求:利用书本上的栈的顺序存储结构定义, #define STACK_INIT_SIZE 100 //存储空间初始分配量 typedef struct SElemType base, base 的初值为NULL SElemType top 找顶指针 int stacksice: 当前已分配的存储空间,以元素为单位+ SgStack 1)编写完成下列功能的函数:(1》初始化一个空栈;(2)随机创建一个包含正整数值的栈(当输入-1时创建结束);(3)将一个数x插在栈顶(x在程序运行时输入);(4)将樣顶元素弹出,并在弹出结束后输出弹出元素的值;(5)输出栈顶元素的值;(6)求栈的长度;(7)输出从栈底到栈顶的所有元素。 2)用主函数调用你所编写的函数,并在使持有所变化的每一步输出栈从栈顶到栈底的所有元素,以验证你编程序的正确性。 备注:(1要求编一菜单,根据选项逐个调用各函数;(2)所编程序要具有一定的健壮性,即;在插入删除时要考虑找空、栈满、位置是否合法等情况,当输入数据非法时,程序也能适当的做出反应,而不致于出现莫名其妙的结果。 2.队列的链式存储结构的实现 要求:利用书本上的链队列有关类型定义, typedef struct 2元{//结点类型。

备注:(1) 要求酒米 性,即:在插入删除时要考虑栈空、栈满、位置是否合法等情况,当输入数据非法时,程序也能适当的做出反应,而不致于出现莫名其妙的结果。

#include <stdio.h>
#include <stdlib.h>

#define STACK_INIT_SIZE 100

typedef int SElemType; // 假设栈元素为整数类型

typedef struct {
    SElemType *base; // 栈底指针
    SElemType *top; // 栈顶指针
    int stacksize; // 当前已分配的存储空间大小
} SqStack;

// 初始化一个空栈
void InitStack(SqStack *S) {
    S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if (!S->base) {
        printf("内存分配失败\n");
        exit(1);
    }
    S->top = S->base;
    S->stacksize = STACK_INIT_SIZE;
}

// 销毁栈
void DestroyStack(SqStack *S) {
    free(S->base);
    S->base = S->top = NULL;
    S->stacksize = 0;
}

// 将元素x插入栈顶
void Push(SqStack *S, SElemType x) {
    if (S->top - S->base >= S->stacksize) {
        printf("栈满,无法插入元素\n");
        return;
    }
    *(S->top) = x;
    S->top++;
}

// 弹出栈顶元素,并返回其值
SElemType Pop(SqStack *S) {
    if (S->top == S->base) {
        printf("栈为空\n");
        exit(1);
    }
    S->top--;
    return *(S->top);
}

// 返回栈顶元素的值
SElemType GetTop(SqStack *S) {
    if (S->top == S->base) {
        printf("栈为空\n");
        exit(1);
    }
    return *(S->top - 1);
}

// 返回栈的长度
int StackLength(SqStack *S) {
    return S->top - S->base;
}

// 输出从栈底到栈顶的所有元素
void PrintStack(SqStack *S) {
    SElemType *p = S->base;
    while (p < S->top) {
        printf("%d ", *p);
        p++;
    }
    printf("\n");
}

int main() {
    SqStack S;
    InitStack(&S);
    int choice, x;
    
    while (1) {
        printf("1. 插入元素\n2. 删除栈顶元素\n3. 输出栈顶元素\n4. 栈的长度\n5. 输出所有元素\n0. 退出\n");
        scanf("%d", &choice);
        
        switch (choice) {
            case 1:
                printf("请输入要插入的元素: ");
                scanf("%d", &x);
                Push(&S, x);
                break;
            case 2:
                printf("弹出的元素值为: %d\n", Pop(&S));
                break;
            case 3:
                printf("栈顶元素值为: %d\n", GetTop(&S));
                break;
            case 4:
                printf("栈的长度为: %d\n", StackLength(&S));
                break;
            case 5:
                printf("栈中的元素为: ");
                PrintStack(&S);
                break;
            case 0:
                DestroyStack(&S);
                exit(0);
            default:
                printf("无效的选项\n");
        }
    }
    
    return 0;
}

2、队列的链式存储结构的实现 要求:利用书本上的链队列有关类型定义, typedef struct QNode{//结点类型 QElemType data: struct QNode next}odeueuePtr:+ typedef struct(//链队列类型。 QueuePtr front: // 队头指针 QueuePtr rear://队尾指针} LinkQueue: 1)编写完成下列功能的函数:(1)初始化一个带头结点的空队列;(2)根据随机输入的队列长度和队列中整数型数据元素的值,创建一个非空链队列;(3)将一个数x插到队尾(x在程序运行时随机输入);(4)删除队头元素,并在删除结束后输出删除元素的值;(5)判定队列是否为空,若不空输出队头元素;(6)输出队列中所有元素。 2)用主函数调用你所编写的函数,并在使队列有所变化的每一步输出队列中的从队头 I 到队尾的元素,以验证你编程序的正确性。

#include <stdio.h>
#include <stdlib.h>

typedef int QElemType; // 假设队列元素为整数类型

// 链队列结点定义
typedef struct QNode {
    QElemType data;
    struct QNode *next;
} QNode, *QueuePtr;

// 链队列类型定义
typedef struct {
    QueuePtr front; // 队头指针
    QueuePtr rear;  // 队尾指针
} LinkQueue;

// 初始化一个带头结点的空队列
void InitQueue(LinkQueue *Q) {
    Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
    if (!Q->front) {
        printf("内存分配失败\n");
        exit(1);
    }
    Q->front->next = NULL;
}

// 销毁队列
void DestroyQueue(LinkQueue *Q) {
    while (Q->front) {
        Q->rear = Q->front->next;
        free(Q->front);
        Q->front = Q->rear;
    }
}

// 插入元素x到队尾
void EnQueue(LinkQueue *Q, QElemType x) {
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    if (!p) {
        printf("内存分配失败\n");
        exit(1);
    }
    p->data = x;
    p->next = NULL;
    Q->rear->next = p;
    Q->rear = p;
}

// 删除队头元素,并返回其值
QElemType DeQueue(LinkQueue *Q) {
    if (Q->front == Q->rear) {
        printf("队列为空\n");
        exit(1);
    }
    QueuePtr p = Q->front->next;
    QElemType x = p->data;
    Q->front->next = p->next;
    if (Q->rear == p) {
        Q->rear = Q->front;
    }
    free(p);
    return x;
}

// 判断队列是否为空,若不空输出队头元素
void GetHead(LinkQueue *Q) {
    if (Q->front == Q->rear) {
        printf("队列为空\n");
        return;
    }
    printf("队头元素为: %d\n", Q->front->next->data);
}

// 输出队列中所有元素
void PrintQueue(LinkQueue *Q) {
    QueuePtr p = Q->front->next;
    while (p) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

int main() {
    LinkQueue Q;
    InitQueue(&Q);
    int choice, x, length;
    
    while (1) {
        printf("1. 插入元素\n2. 删除队头元素\n3. 判断队列是否为空并输出队头元素\n4. 输出队列中所有元素\n0. 退出\n");
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                printf("请输入要插入的元素: ");
                scanf("%d", &x);
                EnQueue(&Q, x);
                break;
            case 2:
                printf("删除的队头元素值为: %d\n", DeQueue(&Q));
                break;
            case 3:
                GetHead(&Q);
                break;
            case 4:
                printf("队列中的元素为: ");
                PrintQueue(&Q);
                break;
            case 0:
                DestroyQueue(&Q);
                exit(0);
            default:
                printf("无效的选项\n");
        }
    }

    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值