XDOJ判断堆栈出栈序列是否有效

描述:

如果以序列“1,2,3,4”作为一个栈(初始为空)的输入,那么可得到输出序列“1,2,3,4”或“4,3,2,1”或“2,3,1,4”等等,但是肯定得不到输出序列“4,1,2,3”或“3,1,2,4”等等。请编写一个程序,判断能否通过一个栈得到给定的输出序列。

输入说明:

每组数据由两行构成,第一行只有一个整数n(<10),表示序列长度,同时表示栈的输入序列为“1,2,3,…,n”;第二行为n个整数,表示需要判断的出栈序列,整数之间以空格分隔。

输出说明:

输出一个yes或no(表示能否通过栈得到该序列)。

输入样例:

6

3 4 21 5 6

输出样例

yes

提示

根据栈的后进先出特性进行判断

#include <bits/stdc++.h>
#define MAX 10
    using namespace std;
// 定义栈
typedef struct Stack
{
    int items[MAX];
    int top; // 指向最高的元素
} myStack, *stackPoint;

// 创造空栈
stackPoint createEmpty(stackPoint sp)
{
    sp->top = -1;
    return sp;
}

// 判断栈空
bool isEmpty(stackPoint sp)
{
    int temp = sp->top;
    if (temp == -1)
        return true;
    else
        return false;
}

// 判断栈满
bool isFull(stackPoint sp)
{
    int temp = sp->top;
    if (temp == MAX - 1)
        return true;
    else
        return false;
}

// 往栈中添加一个元素
void pushElem(stackPoint sp, int num)
{
    if (!isFull(sp))
    {
        sp->top++;
        sp->items[sp->top] = num;
    }
}
// 从栈中删除一个元素
void pop(stackPoint sp)
{
    if (!isEmpty(sp))
    {
        sp -> top--;
    }
}
// 输出栈中所有元素
void stackPrint(stackPoint sp)
{
    if (!isEmpty(sp))
    {
        for (int i = 0; i <= sp->top; i++)
        {
            cout << sp->items[i] << endl;
        }
    }
}

int judgeList(stackPoint sp, int* nums, int length){
    int flag = 0;
    int i = 0;// 待检测序列的下标
    int j = 1;// 入栈出栈的元素
    pushElem(sp, j);//初始化第一个元素
    while(true){
        if(sp -> top == -1){
            //如果没有元素
            j++;
            pushElem(sp, j);
        }
        if(sp ->items[sp -> top] > nums[i]){// 栈顶元素不能大于待检测序列的元素,
            flag = 0;
            break;
        }
        if(sp ->items[sp -> top] < nums[i]){
            //继续添加元素
            j++;
            pushElem(sp, j);
        }
        if(sp ->items[sp ->top] == nums[i]){
            pop(sp);//出栈
            i++;//检测下一个元素
        }
        if (i == length){
            //检测完成
            flag = 1;
            break;
        }
    }
    return flag;
}
int main(void) {
    // 演示
    stackPoint sp = new myStack;
    createEmpty(sp);

    int length = 0;
    // printf("请输入长度:");
    scanf("%d", &length);

    // 输入待判断序列
    int nums[length];
    // printf("请输入待判断序列:");
    for(int i = 0; i < length; i++){
        scanf("%d", &nums[i]);
    }

    int flag = judgeList(sp, nums, length);
    if(flag){
        printf("yes");
    } else {
        printf("no");
    }
    delete sp;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 好的,以下是一个简单的C语言代码实现堆栈出栈和入栈的函数。 ``` #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 int stack[MAX_SIZE]; int top = -1; void push(int value) { if (top == MAX_SIZE - 1) { printf("Error: Stack overflow\n"); return; } top++; stack[top] = value; } int pop() { if (top == -1) { printf("Error: Stack underflow\n"); return -1; } int value = stack[top]; top--; return value; } int main() { push(1); push(2); push(3); printf("%d\n", pop()); printf("%d\n", pop()); printf("%d\n", pop()); return 0; } ``` 希望对你有所帮助! ### 回答2: 当然可以帮您用C语言编写一个堆栈出栈入栈的函数。 首先,我们需要定义一个堆栈的结构体,用来存储堆栈的数据和相关信息。结构体中包括堆栈的最大容量、当前容量和一个指向存储数据的数组的指针。例如: ```c #define MAX_SIZE 100 typedef struct { int top; int capacity; int* data; } Stack; ``` 接下来,我们需要初始化堆栈。这个函数将为堆栈分配内存,并将top和capacity的值都设置为0。例如: ```c void initStack(Stack* stack) { stack->top = 0; stack->capacity = MAX_SIZE; stack->data = (int*)malloc(sizeof(int) * MAX_SIZE); } ``` 然后,我们编写一个入栈函数,用于向堆栈中添加元素。这个函数将检查堆栈是否已满,如果没有满,则将元素添加到堆栈顶部,并将top加1。例如: ```c void push(Stack* stack, int value) { if (stack->top == stack->capacity) { printf("堆栈已满,无法入栈!\n"); return; } stack->data[stack->top++] = value; printf("元素 %d 入栈成功!\n", value); } ``` 接着,我们编写一个出栈函数,用于从堆栈中移除元素。这个函数将检查堆栈是否为空,如果不为空,则将顶部元素移除,并将top减1。例如: ```c int pop(Stack* stack) { if (stack->top == 0) { printf("堆栈为空,无法出栈!\n"); return -1; } int value = stack->data[--stack->top]; printf("元素 %d 出栈成功!\n", value); return value; } ``` 最后,记得在程序结束时释放堆栈的内存,以免造成内存泄漏。例如: ```c void destroyStack(Stack* stack) { free(stack->data); } ``` 以上就是用C语言实现堆栈入栈出栈的基本函数。您可以根据需求在这个基础上进一步扩展功能。希望对您有帮助! ### 回答3: 以下是用C语言编写的堆栈出栈和入栈函数的示例: ```c #include <stdio.h> #define STACK_SIZE 10 int stack[STACK_SIZE]; int top = -1; // 入栈函数 void push(int data) { if (top < STACK_SIZE - 1) { stack[++top] = data; printf("%d 入栈成功!\n", data); } else { printf("堆栈已满,无法入栈!\n"); } } // 出栈函数 int pop() { if (top >= 0) { int data = stack[top--]; printf("%d 出栈成功!\n", data); return data; } else { printf("堆栈为空,无法出栈!\n"); return -1; // 用-1表示堆栈为空 } } int main() { push(10); // 将10入栈 push(20); // 将20入栈 push(30); // 将30入栈 int data = pop(); // 出栈操作 printf("出栈的元素是:%d\n", data); return 0; } ``` 运行这段代码后,将会得到以下输出: ``` 10 入栈成功! 20 入栈成功! 30 入栈成功! 30 出栈成功! 出栈的元素是:30 ``` 这个例子实现了一个简单的整数类型堆栈。`push()`函数用于将数据压入堆栈,`pop()`函数用于从堆栈中弹出数据。在这个例子中,我们使用了一个数组来模拟堆栈,通过变量`top`来记录堆栈顶部的位置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gledfish

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值