PTA 6.6反向输出整数序列 --数据结构 栈

博客围绕用栈反向输出整数序列的程序展开。介绍了输入输出要求,输入为以 -1 结束的非负整数序列,需反向输出。还给出C语言实现提示,如使用 bool 类型要包含特定头文件,栈操作需检查容量。此外,指出个人出错点,如函数返回值理解错误、未分配空间就使用结构指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本题提示:

创建一个足够大的空间来存放数据

要对出栈和入栈的位置要有敏感

题目描述
输入一个整数序列(非负整数,只含 正整数 和 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  

代码:

Stack createStack(void)
{
    Stack s=(Stack)malloc(sizeof(Stack));
    s->top=-1;
    s->capacity=99999999;
    s->base=(int*)malloc(sizeof(int)*s->capacity);
    return  s;
}

void push(Stack pStack, ElemType x)
{
    if(pStack->top==pStack->capacity)
        return;
    pStack->base[pStack->top]=x;
    pStack->top++;
}

ElemType top(Stack pStack)
{
    return pStack->base[pStack->top-1];
}

void pop(Stack pStack)
{
    if(pStack->top+1==0)
        return;
    pStack->top--;
}

bool empty(Stack pStack)
{
    if(pStack->top+1==0)
        return true;
    return false;
}

void destroy(Stack pStack)
{
    free(pStack->base);
}

 个人出错的地方:

(1) 函数top返回值top--和top-1的错误理解,--是top的值-1,top-1则不涉及值改变

(2)错误 ‘s’is used uninitialized in this function,错误原因:没有给s分配空间就使用

也就是说定义一个结构指针不能直接使用

 

### Java 实现整数倒序输出 PTA 题目解法 为了实现Java中的整数倒序输出,可以采用多种方法。下面提供一种基于控制台输入的解决方案,该方案适用于PTA平台上的题目要求。 #### 方法一:使用数组存储再逆向遍历打印 此方法涉及创建一个固定长度为10的数组来储存用户输入的十个整数,之后通过循环结构反向读取这些数值并依次显示出来[^1]。 ```java import java.util.Scanner; public class IntegerReverseOutput { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[] numbers = new int[10]; // 输入阶段 for (int index = 0; index < numbers.length; ++index){ numbers[index] = scanner.nextInt(); } // 输出阶段 boolean isFirstElement = true; for (int position = numbers.length - 1; position >= 0 ; --position){ if (!isFirstElement){ System.out.print(", "); } System.out.print(numbers[position]); isFirstElement = false; } System.out.println(); // 结束后的换行符 } } ``` 上述代码实现了接收一系列由用户提供的整数,并按照相反顺序展示给定序列的功能。特别注意的是,在连续两个数字间加入了逗号作为分隔符,而最后一个元素后面不附加任何额外字符[^4]。 #### 方法二:单个大整数逐位拆分反转 如果目标是从单一的大整数中提取每一位数字并将其按原位置相反的方向排列,则可考虑如下方式: ```java public class SingleIntegerReverse { private static void reversePrint(long num){ String strNum = Long.toString(num); StringBuilder reversedStrBuilder = new StringBuilder(strNum).reverse(); long reversedNumber = Long.parseLong(reversedStrBuilder.toString()); System.out.println(reversedNumber); } public static void main(String[] args) { reversePrint(123456789L); // 测试用例 } } ``` 这种方法适合于处理较大的单独整数而非多个独立的小整数集合的情况。它利用`StringBuilder`类内置的方法轻松完成字符串形式下的数字翻转操作[^2]。 对于更复杂的场景比如带有符号(-/+), 或者需要保留前导零等情况, 则可能还需要进一步调整逻辑以满足具体需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值