1.求解规定序列能否由入栈出栈操作得到
输入:
有若干组数据输入
每组数据中,第一行为两个个整数 n 和 m。n 表示需要依次从 1~n 入栈,m 表示这组数据有 m 个出栈序列需要判断,当 n=0 且 m=0 时停止。
接下来有行,每行表示一个出栈序列
输出:
对每一个出栈序列,如果能正常出栈,输出Yes,否则输出 No。
sample:
input:
5 2
1 2 3 4 5
5 4 1 2 3
6 1
6 5 4 3 2 1
0 0
output:
Yes
No
Yes
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 无限制 | 64M | 0 |
代码如下:(相当赶工的代码,可能不是很完善呜呜┭┮﹏┭┮)
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef struct
{
int *arr;
int top;
int size;
} Stack;
Stack *createStack(int size)
{
Stack *stack = (Stack *)malloc(sizeof(Stack));
stack->arr = (int *)malloc(size * sizeof(int));
stack->top = -1;
stack->size = size;
return stack;
}
bool Empty(Stack *stack)
{
return stack->top == -1;
}
bool Full(Stack *stack)
{
return stack->top == stack->size - 1;
}
void push(Stack *stack, int item)
{
if (Full(stack))
{
printf("Stack Overflow\n");
return;
}
stack->arr[++stack->top] = item;
}
int pop(Stack *stack)
{
if (Empty(stack))
{
printf("Stack Underflow\n");
return -1;
}
return stack->arr[stack->top--];
}
bool check(int n, const int *sequence)
{
Stack *st = createStack(n);
int num = 1;
for (int i = 0; i < n; i++)
{
while (Empty(st) || st->arr[st->top] != sequence[i])
{
if (num > n)
return false;
push(st, num);
num++;
}
pop(st);
}
return true;
}
int main()
{
int n, m;
scanf("%d %d", &n, &m);
while (n != 0 && m != 0)
{
for (int i = 0; i < m; i++)
{
int *sequence = (int *)malloc(n * sizeof(int));
for (int j = 0; j < n; j++)
scanf("%d", &sequence[j]);
if (check(n, sequence))
printf("Yes\n");
else
printf("No\n");
free(sequence);
}
if (scanf("%d %d", &n, &m) && n != 0 && m != 0)
printf("\n");
}
return 0;
}