stack.h
#ifndef stack_h__
#define stack_h__
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
enum boolean{FALSE, TRUE};
typedef enum boolean BOOL;
typedef int ElementType;
typedef struct stack_def{
ElementType* data;
int top;
int sz;
int length;
}stack;
void initStack(stack* s, int sz);
BOOL isEmpty(stack s);
BOOL isFull(stack s);
BOOL Pop(stack* s);
BOOL Push(stack* s, ElementType e);
ElementType getTop(stack s);
void destoryStack(stack* s);
#endif // stack_h__
stack.c
#include "stack.h"
void initStack(stack* s, int sz){
if (sz < 0){
puts("sz < 0");
}
else{
s->top = -1;
s->sz = sz;
s->length = 0;
s->data = (ElementType*)malloc(sizeof(ElementType)*s->sz);
if (s->data == NULL)
puts("s->data == NULL");
}
}
BOOL isEmpty(stack s){
return(BOOL)(s.length==0);
}
BOOL isFull(stack s){
return(BOOL)(s.length==s.sz);
}
BOOL Pop(stack* s){ // 出栈,并不返回此元素值
if (isEmpty(*s)){
return FALSE;
}
s->top--;
s->length--;
}
BOOL Push(stack* s, ElementType e){ // 入栈
if (isFull(*s)){
return FALSE;
}
s->data[++s->top] = e;
s->length++;
return TRUE;
}
ElementType getTop(stack s){
if (isEmpty(s)){
puts("stack s is empty.");
exit(1);
}
return s.data[s.top];
}
void destoryStack(stack* s){
free(s->data);
}
main.c
#include "stack.h"
#include <string.h>
int isSpecalStr(char *str, int str_len){ //判断是否为回文字符串
stack s1, s2, tmp;
int i, ret = 1;
ElementType e;
initStack(&s1, str_len/2);
initStack(&s2, str_len/2);
initStack(&tmp, str_len/2);
for (i=0; i<str_len/2; i++){
Push(&s1, str[i]);
Push(&tmp, str[i+str_len/2]);
}
while (!isEmpty(tmp)){
Push(&s2, getTop(tmp));
Pop(&tmp);
}// end while
while (!isEmpty(s1) && !isEmpty(s2)){
if (getTop(s1) != getTop(s2)){
ret = 0; break;
}
Pop(&s1); Pop(&s2);
}// end while
destoryStack(&s1);
destoryStack(&s2);
destoryStack(&tmp);
return ret;
}
int main(){
char str[50];
stack s;
int len ;
initStack(&s, 50);
printf("输入一个字符串:");
gets(str);
len = strlen(str);
if (isSpecalStr(str, len))
puts("YES");
else
puts("NO");
return 0;
}
运行结果: