反向输出整数序列

文章介绍了如何在C语言中使用栈数据结构处理一个非负整数序列,要求栈在满和空间过大的情况下进行动态扩容和缩容。给出了createStack,push,pop,top,empty,destroy函数的定义和示例程序.
摘要由CSDN通过智能技术生成

分数 10

作者 伍建全

单位 重庆科技大学

题目描述

输入一个整数序列(非负整数,只含 正整数 和 0 )。序列以 -1 结束。要求反向输出这个非负整数序列。

要求定义一个栈来实现这个程序的功能。

输入

一个整数序列,每个数之间以空格隔开,非负整数,只含 正整数 和 0 。输入-1 表示输入结束。

输出

反向输出这个非负整数序列。

提示:

1、在C语言程序中使用 bool 类型,必须包含头文件 stdbool.h

2、题目要求创建栈时,栈空间有16个存储单元。但是服务器测试数据有超过50万个数据需要输入。因此,要求Push操作检查当前存储空间是否已满。若当前存储空间已满,则需要把容量(capacity)扩大为原来容量的2倍。

3、在Pop操作中,也要求检查容量。若弹出1个元素后,已用空间只有容量的三分之一,把容量减少为原来容量的一半。

函数接口定义:

栈的定义如下:

typedef int ElemType;

struct StackRecord;
typedef struct StackRecord *Stack;

struct StackRecord
{
    ElemType  *base;  //指向栈的元素存储空间
    int     top;      // 栈顶
    int   capacity;   //  当前已分配空间,以元素为单位
};


写出 createStack,push, pop,top,empty,destroy函数的定义。函数声明如下:

Stack createStack(void); //初始化一个空栈。空栈拥有16个元素的空间,栈顶值为 -1

void push(Stack pStack, ElemType x);//把 x 入栈

ElemType top(Stack pStack);//返回当前栈顶元素的值

void pop(Stack pStack); //当前栈顶元素出栈

bool empty(Stack pStack);//如果栈空,则返回 true,否则返回 false

void destroy(Stack pStack);//清空分配给栈的存储空间

 

裁判测试程序样例:

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

typedef int ElemType;

struct StackRecord;
typedef struct StackRecord *Stack;

struct StackRecord
{
    ElemType  *base;  //指向栈的元素存储空间
    int     top;      // 栈顶
    int   capacity;   //  当前已分配空间,以元素为单位
};

Stack createStack();
void push(Stack pStack, ElemType x);
void pop(Stack pStack);
ElemType top(Stack pStack);
bool empty(Stack pStack);
void destroy(Stack pStack);

int main(void)
{
    Stack pStack;
    pStack = createStack();
    int x;
    scanf("%d", &x);
    while (x != -1)
    {
        push(pStack, x);
        scanf("%d", &x);
    }
    while (!empty(pStack))
    {
        x = top(pStack);
        printf("%d ", x);
        pop(pStack);
    }
    destroy(pStack);
    return 0;
}
/* 请在这里填写答案 */

 

输入样例:

在这里给出一组输入。例如:

3 127 64 1991 -1

输出样例:

在这里给出相应的输出。例如:

1991 64 127 3 

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

C程序如下:

Stack createStack() {
    Stack p = (Stack)malloc(sizeof(struct StackRecord));//分配栈结构体内存
    if (p == NULL) {
        printf("Memory allocation failed!");//内存分配失败
        exit(EXIT_FAILURE);//终止程序
    }
    p->top = -1;//初始化栈顶指针为-1,表示空栈
    p->capacity = 16;//初始化容量为16
    p->base = (ElemType*)malloc(sizeof(ElemType) * p->capacity);//分配栈元素的初始内存空间
    if (p == NULL) {
        printf("Memory allocation failed!");//内存分配失败
        exit(EXIT_FAILURE);//终止程序
    }
    return p;//返回栈的指针
}
void push(Stack pStack, ElemType x) {
    Stack p = pStack;//定义一个指针指向站结构体
    if (p->top >= p->capacity - 1) {//检查栈是否为满
        p->capacity *= 2;//如果已满,则扩容为原来的两倍
        p->base = (ElemType*)realloc(p->base ,sizeof(ElemType) * p->capacity);//重新分配内存空间
    }
    p->top++;//栈顶指针加一
    p->base[p->top] = x;//元素入栈
}
void pop(Stack pStack) {
    if (pStack->top * 3 <= pStack->capacity) {//检查栈空间是否过大
        pStack->capacity /= 2;//如果过大,则减小容量为原来的一半
        pStack->base = (ElemType*)realloc(pStack->base, sizeof(ElemType) * pStack->capacity);//重新分配内存空间
    }
    if (pStack == NULL) {
        printf("Memory allocation failed!");//内存分配失败
        exit(EXIT_FAILURE);//退出程序
    }
    pStack->top--;//栈顶指针减一
}
ElemType top(Stack pStack) {
    return pStack->base[pStack->top];//返回栈顶元素的值
}
bool empty(Stack pStack) {
    if (pStack->top == -1) {//如果栈为空
        return true;//返回true
    }
    else {
        return false;//否则返回false
    }
}
void destroy(Stack pStack) {
    free(pStack->base);//释放栈元素的内存空间
    free(pStack);//释放站结构体的内存空间
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值