1. 程式人生 > >迴文字串(堆疊演算法)

迴文字串(堆疊演算法)

題目描述

給出一個長度不超過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;
    }
}