回文判断(堆栈)


在这里插入图片描述

1.顺序栈

#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define MAXSIZE 10000
typedef char SElemType;
typedef struct StackNode * StackLink;
typedef struct StackNode{
	SElemType *base,*top;//栈底指针,栈顶指针
	int stacksize;//堆栈最大容量
}StackNode;
//初始化
void InitStack(StackLink &S){
	S->base = new SElemType;
	S->top = S->base;
	S->stacksize = MAXSIZE;
	return;
}
//入栈
bool Push(StackLink &S,SElemType e){
	if ((S->top - S->base) == S->stacksize)return false;//栈满
	*S->top++ = e;
	return true;
}
//出栈
bool Pop(StackLink &S, SElemType &e){
	if (S->top == S->base)return false;//栈空
	e=*--S->top;//栈顶指针永远指向下一个元素入栈的位置
	//栈顶元素在栈顶指针-1的位置上,--S->top后指向栈顶元素,并且栈顶指针-1了
	return true;
}
bool JudgePalindrome(char a[], int num){
	StackLink S = new StackNode;
	SElemType e;
	InitStack(S);
	int into = num / 2,i=1;
	if (S->stacksize < into){ printf("太长\n"); return false; }
	for (; i <= into; i++){
		Push(S, a[i-1]);
	}
	if (num % 2)i++;//如果是奇数则跳过中间数
	for (; i <= num; i++){
		Pop(S, e);
		if (e != a[i - 1])return false;
	}
	return true;
}
int main(){
	int n;
	char * a=new char;
	scanf("%d", &n);
	fflush(stdin);
	for (int i = 0; i < n; i++){
		a[i] = getchar();
	}
	fflush(stdin);
	if (JudgePalindrome(a, n))
		printf("是\n");
	else
		printf("不是\n");
	system("pause");
	return 0;
}

1.0.结构体

#define MAXSIZE 10000
typedef char SElemType;
typedef struct StackNode * StackLink;
typedef struct StackNode{
	SElemType *base,*top;//栈底指针,栈顶指针
	int stacksize;//堆栈最大容量
}StackNode;

1.1初始化

void InitStack(StackLink &S){
	S->base = new SElemType;
	S->top = S->base;
	S->stacksize = MAXSIZE;
	return;
}

1.2入栈

bool Push(StackLink &S,SElemType e){
	if ((S->top - S->base) == S->stacksize)return false;//栈满
	*S->top++ = e;
	return true;
}

1.3出栈

bool Pop(StackLink &S, SElemType &e){
	if (S->top == S->base)return false;//栈空
	e=*--S->top;//栈顶指针永远指向下一个元素入栈的位置
	//栈顶元素在栈顶指针-1的位置上,--S->top后指向栈顶元素,并且栈顶指针-1了
	return true;
}

1.4回文判断

bool JudgePalindrome(char a[], int num){
	StackLink S = new StackNode;
	SElemType e;
	InitStack(S);
	int into = num / 2,i=1;
	if (S->stacksize < into){ printf("太长\n"); return false; }
	for (; i <= into; i++){
		Push(S, a[i-1]);
	}
	if (num % 2)i++;//如果是奇数则跳过中间数
	for (; i <= num; i++){
		Pop(S, e);
		if (e != a[i - 1])return false;
	}
	return true;
}

2.链栈

#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef char SElemType;
typedef struct StackNode *LinkStack;
typedef struct StackNode{
	SElemType data;
	LinkStack next;
}StackNode;
//初始化
void InitStack(LinkStack &S){
	S = new StackNode;
	S->next = NULL;
	return;
}
//入栈
void Push(LinkStack &S,SElemType e){
	LinkStack p;
	InitStack(p);
	p->data = e;
	p->next = S;

	S = p;
	return;
}
//出栈
void Pop(LinkStack &S, SElemType &e){
	if (!S)return;//栈空
	e = S->data;
	LinkStack q = S;
	S = S->next;
	delete q;
	return;
}
bool JudgePalindrome(char a[], int num){
	LinkStack S = NULL;
	SElemType t;
	int into = num / 2,i;
	for (i = 1; i <= into; i++){
		Push(S, a[i-1]);
	}
	if (num % 2)i++;//如果是奇数,中间的数要跳过
	for (; i <= num; i++){
		Pop(S, t);
		if (t != a[i - 1])return false;
	}
	return true;
}
int main(){
	int n;
	char * a=new char;
	scanf("%d", &n);
	fflush(stdin);
	for (int i = 0; i < n; i++){
		a[i] = getchar();
	}
	fflush(stdin);
	if (JudgePalindrome(a, n))
		printf("是\n");
	else
		printf("不是\n");
	system("pause");
	return 0;
}

2.0.结构体

typedef char SElemType;
typedef struct StackNode *LinkStack;
typedef struct StackNode{
	SElemType data;
	LinkStack next;
}StackNode;

2.1.初始化

//初始化
void InitStack(LinkStack &S){
	S = new StackNode;
	S->next = NULL;
	return;
}

2.2.入栈

void Push(LinkStack &S,SElemType e){
	LinkStack p;
	InitStack(p);
	p->data = e;
	p->next = S;

	S = p;
	return;
}

2.3.出栈

void Pop(LinkStack &S, SElemType &e){
	if (!S)return;//栈空
	e = S->data;
	LinkStack q = S;
	S = S->next;
	delete q;
	return;
}

2.4.判断回文

bool JudgePalindrome(char a[], int num){
	LinkStack S = NULL;
	SElemType t;
	int into = num / 2,i;
	for (i = 1; i <= into; i++){
		Push(S, a[i-1]);
	}
	if (num % 2)i++;//如果是奇数,中间的数要跳过
	for (; i <= num; i++){
		Pop(S, t);
		if (t != a[i - 1])return false;
	}
	return true;
}

3.问题

8以内没问题,超过8就会运行出错

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Deosiree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值