元素出栈、入栈的合法性检验:
方法步骤:
1)入栈顺序用数组aa存储,出栈顺序用数组bb存储
2)检验*aa==*bb是否满足,若满足,aa++,bb++;{否则,检验栈顶元素与*bb是否相等,若相等,出栈,bb++;否则,入栈},
3)一直循环2),直到数组aa和数组bb全部走完,结束(栈中元素也要出完!)
头文件:栈.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
//函数接口:
typedef int SDataType;
typedef struct Stack {
SDataType array[100];
int top;
} Stack;
// 初始化
void StackInit(Stack *pStack){
pStack->top = 0;
*(pStack->array) = { 0 };
}
// 压栈
void StackPush(Stack *pStack, SDataType data)
{
if (pStack->top == 0)
{
*(pStack->array) = data;
pStack->top++;
return;
}
pStack->array[pStack->top] = data;
pStack->top++;
return;
}
// 出栈
void StackPop(Stack *pStack)
{
pStack->top--;
pStack->array[pStack->top] = pStack->array[pStack->top + 1];
}
// 返回栈顶元素
SDataType StackTop(Stack *pStack)
{
//StackPop(pStack);
return pStack->array[pStack->top-1];
}
//元素出栈、入栈的合法性
int IsPop_Push(Stack*pStack, SDataType*aa,SDataType*bb,int n,int m)
{
if (m != n)
return -1;
while (n != -1&&m!=0)
{//此时,*aa和*bb相等,aa,bb同时向后走一步.
if (*aa == *bb)
{
aa++; n--; bb++; m--;
}
//*aa和*bb不相等,
else
{//栈顶元素和*bb相等
if (pStack->array[pStack->top-1] == *bb)
{
StackPop(pStack);
bb++; m--;
}
else
{//入栈,*aa
StackPush(pStack, *aa);
aa++; n--;
}
}
}
if (m == 0)
{
printf("正确!\n");
return 0;
}
else
{
printf("错误\n");
return -1;
}
}
void test1()
{
Stack pStack;
StackInit(&pStack);
SDataType aa[] = { 1, 2, 3, 4, 5 };
SDataType bb[] = { 2, 1, 3, 5, 4 };
int n = sizeof(aa) / sizeof(SDataType);
int m = sizeof(bb) / sizeof(SDataType);
IsPop_Push(&pStack, aa, bb,n,m);
}
源文件:main.cpp
#include"栈.h"
int main()
{
test1();
system("pause");
return 0;
}