头文件SqStack.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<iostream>
using namespace std;
#define Maxsize 50
typedef int ElemType;
typedef struct
{
ElemType data[Maxsize];
int top;
}SqStack;
//函数声明
void InitStack(SqStack*& S);//初始化栈
bool StackEmpty(SqStack*& S);//判断栈是否为空
bool Push(SqStack*& S, ElemType e);//入栈操作
bool Pop(SqStack*& S, ElemType& e);//出栈操作
void GetTop(SqStack*& S, ElemType& e);//获取栈顶元素操作,将栈顶元素赋值给参数e,不进行栈顶元素删除
void DestroyStack(SqStack*& S);//销毁栈
cpp文件
#include"SqStack.h"
/*****************************************************************//**
###整体思路
* 创建一个辅助栈,按顺序进入辅助栈,判断辅助栈的顶位元素是否为出栈顺序的第一个元素,
* 直到相等后开始出栈,一直出栈到元素不相等为止,若遍历完辅助栈不为空栈,则给定的出栈顺序非法
*********************************************************************/
bool Judgement(SqStack*&S,int n, int num[])//n表示初始时栈的长度,num[]表示给出的一种出栈顺序
{
S->data[n] = { 0 };
for (int i = 0, k = 1; i < n; i++, k++)
{
S->data[i] = k;//采用辅助栈一边进栈一边判断的方式
while (S->data[i] == num[0])//如果该进栈元素为出栈顺序的第一个元素,则继续对辅助栈和给定数组进行操作
{
for (int j = i; j < n; j++)
{
S->data[j] = S->data[j + 1];//将辅助栈后面的元素往前移一位(虽然一开始初始化均为0?)
}
for (int j = 0; j < n; j++)
{
num[j] = num[j + 1];//给定的出栈顺序数组也往前移动一位,因为此时已经处理完了最前面那个元素了
}
n -= 1;//处理完一个数之后n就减一
i--;//一开始进了栈后面又相当于出栈了(把后面的元素都往前移了一位),相当于没进栈,所以i要减回去
}
}
if (n != 0)
{
return false;
}
else
{
return true;
}
}
int main(int argc, char* argv[])
{
SqStack* S;//S为辅助栈
InitStack(S);
int num[50];
int n;
cout << "请输入栈的长度:";
cin >> n;
cout << "请依次输入出栈元素:";//每输完一个数都要摁一次回车?
for (int i = 0; i < n; i++)
{
cin >> num[i];
}
if (Judgement(S, n, num))
{
printf("为合法出栈顺序\n");
}
else
{
printf("为非法出栈\n");
}
DestroyStack(S);
return 0;
}