使用顺序栈判断给定的出栈顺序是否合法

本文介绍了如何使用C++编程语言实现一个名为SqStack的栈数据结构,并提供了一个辅助函数Judgement来判断给定的出栈顺序是否合法。通过辅助栈逐个比较元素,确保出栈顺序符合规则。
摘要由CSDN通过智能技术生成

头文件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;
}


在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值