常见算法题:判断表达式是否是回文

题目:设计一个算法,判断用户输入的表达式中是否是回文(回文即左右对称的字符串)。

思路:这道题与判断表达式括号是否匹配类似,可使用顺序栈来解决,区别是回文要求每个字符都要求匹配,因此将字符串全部入栈,再全部出栈,将最后一个字符与第一个字符比较是否相同,依次比较,若全部相同则为回文。

代码:

#include<iostream>
#include<string>
using namespace std;
#define MaxSize 20
//字符串栈
class Stack
{
    char *data;
    int top;
public:
    Stack();
    ~Stack();
    bool IsEmpty();
    bool Push(char e);
    bool Pop(char& e);
};

Stack::Stack()
{
    data = new char[MaxSize];
    top = -1;
}

Stack::~Stack()
{
    delete [] data;
}

bool Stack::IsEmpty()
{
    return (top == -1);
}

bool Stack::Push(char e)
{
    if(top == MaxSize-1)    return false;   //栈满
    top++;
    data[top] = e;
    return true;
}

bool Stack::Pop(char& e)
{
    if(top == -1)   return false;   //栈空
    e = data[top];
    top--;
    return true;
}
//判断回文
bool IsPalindrome(char str[],int n)
{
    int i=0;char e;
    Stack st;
    while(i<n)
    {
        st.Push(str[i]);
        i++;
    }
    i=0;
    while(i<n)
    {
        st.Pop(e);
        if(str[i]!=e)   return false;
        i++;
    }
    return true;
}

void main()
{
    cout<<"请输入表达式:"<<endl;
    char str[MaxSize];
    cin>>str;
    int n = strlen(str);
    if(IsPalindrome(str,n))
        cout<<"表达式"<<str<<"是回文"<<endl;
    else
        cout<<"表达式"<<str<<"不是回文"<<endl;
}

测试数据1:qwerewq

测试结果1:

测试数据2:qwertyu

测试结果2:

时间: 2024-11-10 07:11:07

常见算法题:判断表达式是否是回文的相关文章

算法15---数论6---素数,回文素数 分解质因素

算法15---数论6---素数,回文素数  分解质因素 1 /* 2 题目:素数,回文素数 3 author taoliu——alex 2016.10 number4 4 5 主要实现: 6 判断素数,判断回文素数 7 */ 8 9 10 11 #include <stdio.h> 12 #include <math.h> 13 14 15 16 //素数 17 18 19 int isprime(int a) 20 { 21 for (int i = 2; i < a; i

用递归方法判断字符串是否是回文(Recursion Palindrome Python)

所谓回文字符串,就是一个字符串从左到右读和从右到左读是完全一样的.比如:"level" ."aaabbaaa". "madam"."radar". 如何判断字符串是否是回文呢?解决思路如下: 1. 采取穷举法(Brute Force algorithm),枚举并检查(enumerate & check)字串符的第一项和最后一项是否等同 2. 把检查范围逐步缩小,如果字串符的第一项和最后一项等同,那么去除字串符的第一项和

输入一串字符,字符个数不超过100,且以“.”结束。 判断它们是否构成回文。

输入一串字符,字符个数不超过100,且以“.”结束. 判断它们是否构成回文. [分析]所谓回文指从左到右和从右到左读一串字符的值是一样的,如12321,ABCBA,AA等.先读入要判断的一串字符(放入数组letter中),并记住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,就可以判断出是否为回文. 程序如下: #include<iostream>using namespace std;int main(){ char ch,letter[101]; cin>>ch; int

输入任意一个5位数,判断其是否是回文数

输入任意一个5位数,判断其是否是回文数.所谓的回文数是指其个位与万位相同,并且十位与千位相同,比如:12321或者54645: #include <stdio.h>void main(){   int n=0;    printf("请输入任意一个5位数\n");    scanf("%d",&n);   n%10==n/10000&&(n/10)%10==(n/1000)%10 ? printf("%n是一个回文数&q

AC日记——判断字符串是否为回文 openjudge 1.7 33

33:判断字符串是否为回文 总时间限制:  1000ms 内存限制:  65536kB 描述 输入一个字符串,输出该字符串是否回文.回文是指顺读和倒读都一样的字符串. 输入 输入为一行字符串(字符串中没有空白字符,字符串长度不超过100). 输出 如果字符串是回文,输出yes:否则,输出no. 样例输入 abcdedcba 样例输出 yes 思路: 模拟: 来,上代码: #include<cstdio> #include<string> #include<cstring>

Manacher算法--O(n)内求回文子串

昨天做了leetcode里的     Longest Palindromic Substring ,一开始用动态规划O(N^2),不管怎么改都超时了...于是在大神的帮助下,找到了传说中的Manacher算法,居然能在O(n)内求出来,瞬间给跪了. 本屌认为,这个算法主要是充分的利用了以前的匹配的结果,来起到了降低时间复杂度的作用,这点跟KMP算是有点类似.在预处理时有个小技巧就是将第0,1为设为"$#",后面每隔一位加一个"#",这样既能够防止数组越界问题又能够,

输入任意一个5位数,判断其是否是回文数。

#include <stdio.h>void main(){ int a; printf("请输入一个5位数"); scanf("%d",&a); (a/10000==a%10&&(a/1000)%10==(a/10)%10)?printf("是回文数\n"):printf("不是回文数\n");} 输入任意一个5位数,判断其是否是回文数.,布布扣,bubuko.com

【c语言】判断一个数是不是回文数

//判断一个数是不是回文数 #include <stdio.h> #include <assert.h> int panduan(int *p) { int t = 0; int n = *p; assert( *p != NULL ); //每次取出最后一个数乘10加到前边去 while( *p != NULL ) { t = t * 10 + *p % 10; *p = *p / 10; } //如果是回文数就会相等 if( t==n ) { return 1; } else

判断整数是否是回文数

关于 判断整数是否是回文数 几种解法:一是将整数转化为字符形式,但需要额外空间:二是将数字逆转得到另一个数,判断是否与原数相等,但有可能溢出: 符合要求的方法是从数的两端向中间推进判断:如相等则弃掉首尾数字: bool isPalindrome(int x) { if (x < 0) return false; int div = 1; while (x / div >= 10) { div *= 10; } //算数的量级 while (x != 0) { int l = x / div;