栈的应用_回文字符的判定

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;
}

运行结果:
结果1
结果2
结果3

posted @ 2016-09-18 18:05  老耗子  阅读(99)  评论(0编辑  收藏  举报