回文字符串(堆栈算法)

题目描述

给出一个长度不超过1000的字符串,判断它是不是回文(顺读,逆读均相同)的。

输入描述:

输入包括一行字符串,其长度不超过1000。

输出描述:

可能有多组测试数据,对于每组数据,如果是回文字符串则输出"Yes!”,否则输出"No!"。

输入示例

hellolleh
helloworld

输出示例

Yes!
No!

 C语言用堆栈来求回文字符串的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100
typedef struct {
    char a[MAXSIZE];
    int top;
} SeqStack;

SeqStack *Init_stack() { //置空栈
    SeqStack *s;
    s=(SeqStack*)malloc(sizeof(SeqStack));  //申请栈的空间
    s->top=-1;  //初始化栈顶指针
    return s;
}

int Empty_Stack(SeqStack *s) {  //判断是否为空栈
    if(s->top==-1) return 1;
    else return 0;
}

int Push_Stack(SeqStack *s,char x) { //入栈
    if(s->top==MAXSIZE-1) return 0; //栈满不能入栈
    else {
        s->top++;
        s->a[s->top]=x;
        return 1;
    }
}

int Pop_Stack(SeqStack *s,char *x) { //出栈
    if(Empty_Stack(s)) return 0;    //栈空不能出栈
    else {
        *x=s->a[s->top];    //更新栈顶指针
        s->top--;
        return 1;   //栈顶元素存入*x,返回
    }
}

int Top_Stack(SeqStack *s,char *x) {   //取栈顶元素
    if(Empty_Stack(s)) return 0;    //栈空无元素
    else {
        *x=s->a[s->top];
        return 1;
    }
}

int main() {
    char a[100];
    gets(a);
    int len=strlen(a);
    SeqStack *s;
    s = Init_stack();
    char *ch;
    int flag=1;  //flag用来判断是否为回文字符
    for(int i=0; i<len/2; i++) {
        Push_Stack(s,a[i]);  //把前一半的元素入栈
    }
    for(int i=(int)(len/2.0+0.5); i<len; i++) {
        if(Pop_Stack(s,ch)) {
            if(*ch!=a[i]) {
                flag = 0;   //不是回文字符
            }
        }
    }
    if(flag==1)
        printf("Yes!");
    else
        printf("No!");
}

C++用堆栈的话可以直接调用<stack>这个库

#include <bits/stdc++.h>
#include <stack>
using namespace std;

int main()
{
    string s;
    getline(cin,s);
    int len = s.length();
    stack<char> T;
    bool flag = true;  //flag用来判断是否为回文字符
    for(int i=0; i<len/2; i++)
    {
        T.push(s[i]);  //把前一半的元素入栈
    }
    for(int i=(int)(len/2.0+0.5); i<len; i++)
    {
        if(!T.empty())
        {
            if(T.top()!=s[i]) //判断是否与栈顶元素相等
            {
                flag = false;   //不是回文字符
            }
            T.pop();   //删除栈顶元素
        }
    }
    if(flag)
    {
        cout << "Yes!" << endl;
    }
    else
    {
        cout << "No!" << endl;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42449444/article/details/83343843