棧和隊(duì)列算法設(shè)計(jì)題(一)

題目

回文是指正讀反讀均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。試寫(xiě)一個(gè)算法判定給定的字符序列是否為回文。(提示:將一半字符入棧)

算法思想

將字符串前一半入棧,然后,棧中元素和字符串后一半進(jìn)行比較。即將第一個(gè)出棧元素和后一半串中第一個(gè)字符比較,若相等,則再出棧一個(gè)元素與后一個(gè)字符比較,以此類推,直至棧空。

完整代碼

#include <iostream>
#include <string.h>
using namespace std;

//回文是指正讀反讀均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。試寫(xiě)一個(gè)算法判定給定的字符序列是否為回文。(提示:將一半字符入棧) 

#define MAXSIZE 100    //順序棧存儲(chǔ)空間的初始分配量 
typedef int SElemType;
typedef struct{
    SElemType *base;   //棧底指針 
    SElemType *top;    //棧頂指針 
    int stacksize;     //??捎玫淖畲笕萘?
}SqStack; 

//順序棧的初始化
void InitStack(SqStack &S){
    //構(gòu)造一個(gè)空棧 
    S.base = new SElemType[MAXSIZE];  //為順序棧動(dòng)態(tài)分配一個(gè)最大容量為MAXSIZE的數(shù)組空間 
    if(! S.base){
        //exit(OVERFLOW);               //存儲(chǔ)分配失敗 
    }
    S.top = S.base;                   //top初始為base,空棧 
    S.stacksize = MAXSIZE;            //stacksize置為棧的最大容量MAXSIZE 
    //return OK;
} 

//順序棧的出棧
char Pop(SqStack &S, SElemType e){
    //刪除S的棧頂元素,用e返回其值 
    if(S.top == S.base){               //???
        //return ERROR;
    } 
    e == *--S.top;                     //棧頂指針減1,將棧頂元素賦給e 
    return e;
} 

bool EmptyStack(SqStack S){
    if(S.top== 0)
    {
        return false;
    }
   else
   {
        return true;
   }
}

void Push(SqStack &S, SElemType e){
    //插入元素e為新的棧頂元素 
    if(S.top - S.base == S.stacksize){  //棧滿 
        //return ERROR;
    }
    *S.top ++ = e;                      //元素e壓入棧頂,棧頂指針加1 
    //return OK;
} 

int IsPalindrome(SqStack S, char *t)
{
    //判斷t字符向量是否為回文,若是,返回1,否則返回0 
    SElemType e;
    int flag = 1, temp;
    InitStack(S);
    int j = 1, len = strlen(t);           //求向量長(zhǎng)度 
    while(2 * j <= len){
        Push(S, *t);
        j ++;
        *t ++;
    }
    if(len % 2 == 1){
        *t ++;
    } 
    for(int k = j - 1; k >= 1; k --){
        temp = Pop(S,e);
        if(*t == e){
            *t ++;
        } 
        else{
            flag=0;
        } 
    }
    return flag;
}

int main(){
    char *t;
    SqStack S;
    t = "dahlagioa";
    if(IsPalindrome(S, t)){
        cout << "字符串" << t << "是回文" << endl;
    }
    else{
        cout << "字符串" << t << "不是回文" << endl;
    }
    return 0;
}

結(jié)果顯示

TIM圖片20191031102850.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 點(diǎn)擊進(jìn)入我的博客 1 緒論 線性結(jié)構(gòu)的特點(diǎn) 在數(shù)據(jù)元素的非空有限集中,存在唯一的一個(gè)被稱為第一個(gè)的數(shù)據(jù)元素 存在唯...
    盧卡斯嗶嗶嗶閱讀 988評(píng)論 0 1
  • Unicode?標(biāo)準(zhǔn)附錄#9 UNICODE雙向算法#### 摘要#### 本附件是一份關(guān)于字符定位的規(guī)范,主要描...
    Eriice閱讀 5,203評(píng)論 0 6
  • 一、棧 1.1 棧的實(shí)現(xiàn) 棧(Stack)是限制僅在表的一端進(jìn)行插入和刪除運(yùn)算的線性表。java沒(méi)有棧這樣的數(shù)據(jù)結(jié)...
    yjaal閱讀 1,525評(píng)論 0 1
  • 距離參加挺班快過(guò)去1年了,但挺班的影響好像還在持續(xù)。當(dāng)然最明顯的就是我變成了米馬雜貨和頂果有約的忠實(shí)客戶,還介紹給...
    楊大離閱讀 318評(píng)論 0 0
  • 孩子已經(jīng)開(kāi)始跟你斗智了,你卻還在斗勇! 一 涵涵進(jìn)入初中后,也許是因?yàn)榍啻浩诘脑?,她成了個(gè)火藥桶,一點(diǎn)就爆,一言...
    00后老干媽閱讀 726評(píng)論 1 0

友情鏈接更多精彩內(nèi)容