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