栈---回文判断
来源:互联网 发布:金蝶软件建账流程 编辑:程序博客网 时间: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
- 栈---回文判断
- 使用栈判断回文
- 用栈判断回文
- 栈--判断回文字符串
- 判断回文字符串(栈)
- 栈 判断回文序列
- 栈初探(判断回文)
- 判断一个栈是不是回文
- 利用栈判断回文数。
- 判断回文字符串 栈实现
- 判断回文
- 回文判断
- 判断回文
- 判断回文
- 回文判断
- 回文判断
- 判断回文!
- 判断回文
- 数论-唯一分解定理
- 第九周项目2(1)-Time类中的运算符重载(续)
- 结构体类型数据作为函数参数(三种方法
- Median of Two Sorted Arrays
- 小数的二进制表示,阶码
- 栈---回文判断
- java 线程的一些理解
- 栈的压入、弹出序列-剑指offer(java版)
- Symmetric Tree
- 优化 SQL SELECT 语句性能的 6 个简单技巧
- php 建造者模式
- sdcard 和mnt/sdcard 两个文件夹的区别
- MemLeak学习笔记
- 基础教程第三课