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