迴文判斷(堆棧)


在這裏插入圖片描述

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就會運行出錯

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