回文判断(堆栈)


在这里插入图片描述

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就会运行出错

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章