【问题描述】
给出一个堆栈的输入序列,试判断一个序列是否能够由这个堆栈输出。如果能,返回总的出栈次数,如果不能,返回0。序列的输入及输出都是从左往右。(输入输出序列皆为整数且没有重复的数字,如果一个数字在输入序列中没有出现,那么其在输出序列中也不会出现)
【输入形式】
第一行为输入序列的长度,然后为输入序列的数字;第二行为输出序列的数字。输入数据以空格隔开。
【输出形式】
如果是一个出栈序列,则返回总的出栈次数, 否则返回0
【样例输入】
5 1 2 3 4 5 1 2 3 4 5
【样例输出】
5
【样例说明】
第一行输入的第一个数字是序列的长度,1 2 3 4 5 输入序列,以空格隔开,输出的总的出栈次数。
【评分标准】
原理:
源码:
#define MAXSIZE 50 //定义栈中元素的最大个数
#include<stdio.h>
#include<stdlib.h>
typedef struct {
int data[MAXSIZE];
int top; //用于栈顶指针
}SqStack;
void InitStack(SqStack* S) {
S->top = -1; //初始化栈顶指针
}
bool StackEmpty(SqStack* S) {
if (S->top == -1) {
return 0; //栈空
}
else {
return 1; //不空
}
}
/*插入元素e为新的栈顶元素*/
bool Push(SqStack* S, int e) {
//满栈
if (S->top == MAXSIZE - 1) {
return 1;
}
S->top++; //栈顶指针增加一
S->data[S->top] = e; //将新插入元素赋值给栈顶空间
return 0;
}
/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
bool Pop(SqStack* S, int* e) {
if (S->top == -1) {
return 1;
}
*e = S->data[S->top]; //将要删除的栈顶元素赋值给e
S->top--; //栈顶指针减一
return 0;
}
int main()
{
SqStack* A = (SqStack*)malloc(sizeof(SqStack));
InitStack(A);
int n;
int k = 0;
int k1 = 0;
int flag = 0;
int tem[20];
int tem1[20];
int count = 0;
int e = 0;
scanf_s("%d", &n);
for (int i = 0; i < n; i++)//入栈序列
{
scanf_s("%d", &tem[i]);
}
for (int i = 0; i < n; i++)//出栈序列
{
scanf_s("%d", &tem1[i]);
}
for (k; k < n; k++)
{
Push(A, tem[k]);//输入序列一个个入栈
while (A->data[A->top] == tem1[k1])//判断栈顶元素与输出序列的第k1个元素是否相等(相等则出栈)
{
Pop(A, &e);
k1++;
count++;
}
}
//printf("%d %d\n",k,k1);//测试用的
if (StackEmpty(A))//栈为空则
{
flag = 1;
}
if (flag == 0)
{
printf("%d",count);
}
else {
printf("%d", 0);
}
return 0;
}