栈---回文判断

来源:互联网 发布:金蝶软件建账流程 编辑:程序博客网 时间:2024/05/29 07:33

问题

判断一个栈是不是“回文”。回文,英文palindrome,指顺着读和反过来读都一样。

分析

由栈的数据结构可知,栈是一个先进后出的数据结构,因此为了判断该栈是否是一个回文栈,我们可以将栈的一半弹出来,压入另外一个栈,然后再进行判断他们对于数据是否相同即可。当栈的长度为偶数时:

我们只需要弹出一半的数据,然后可直接进行比较。

当栈的长度为奇数时,我们需要弹出一半的长度,然后在比较前需要将最中间的一位去掉。

#include<iostream>#include<cstring>#define MAXSIZE 100using namespace std;typedef char ElemType;typedef struct Stack{    ElemType data[MAXSIZE];    int top;}Stack;typedef Stack *StackPointer;bool InitStack(StackPointer stack){    if(NULL == stack)        return false;    stack->top = 0;    return true;}bool Push(StackPointer stack, ElemType elem){    if(NULL == stack || stack->top >= 100)        return false;    stack->data[(stack->top)++] = elem;    return true;}ElemType Pop(StackPointer stack){    ElemType elem = stack->data[--(stack->top)];    return elem;}bool StackIsPalindom(StackPointer stack){    if(NULL == stack)        return false;    Stack sp;    InitStack(&sp);    int count = 0;    int length = stack->top;    while(count < length/2){        Push(&sp, Pop(stack));        count++;    }    if(length % 2)        Pop(stack);    count = 0;    while(count < length/2){        if(stack->data[count] != sp.data[count])            return false;        count++;    }    return true;}int main(){    Stack stack;    char s[] = "madaam";    InitStack(&stack);    for(int i=0; i<strlen(s); i++)        Push(&stack, s[i]);    cout << StackIsPalindom(&stack) << endl;    return 0;}

思路2

使用这种方法需要额外的增加一个栈,在空间上复杂度较高,那么我们是否可以考虑给定一个字符串,然后将该字符串压入战中,然后再利用该字符串中的每一位与栈中的每一位进行比较,这样字符串压入栈的过程就相当于是将字符串翻转的过程

#include<iostream>#include<cstring>#define MAXSIZE 100using namespace std;typedef char ElemType;typedef struct Stack{    ElemType data[MAXSIZE];    int top;}Stack;typedef Stack *StackPointer;bool InitStack(StackPointer stack){    if(NULL == stack)        return false;    stack->top = 0;    return true;}bool Push(StackPointer stack, ElemType elem){    if(NULL == stack || stack->top >= 100)        return false;    stack->data[(stack->top)++] = elem;    return true;}ElemType Pop(StackPointer stack){    ElemType elem = stack->data[--(stack->top)];    return elem;}bool StackIsPalindom(StackPointer stack, char *s){    if(NULL == stack)        return false;    for(int i=0; i<strlen(s); i++){        if(s[i] != stack->data[(stack->top)-i-1])            return false;    }    return true;}int main(){    Stack stack;    char s[] = "madam";    InitStack(&stack);    for(int i=0; i<strlen(s); i++)        Push(&stack, s[i]);    cout << StackIsPalindom(&stack, s) << endl;    return 0;}
0 0
原创粉丝点击