1. 程式人生 > >資料結構_鏈棧_迴文問題_c++

資料結構_鏈棧_迴文問題_c++

鏈棧結點結構設計

template<class T>
struct StackNode
{
T data;
StackNode<T> *next;
StackNode():next(NULL){}
StackNode(T d,StackNode<T> *link=NULL)
{
data=d;
next=link;
}
};

2) 鏈棧類設計

根據棧的特點,鏈棧類資料成員有棧頂指標,成員函式有構造、入棧、出棧、棧的判空與判滿、訪問棧頂元素、銷燬等操作。

template<class T>
class LinkedStack
{
private
: StackNode<T> *top; public: LinkedStack():top(NULL){} ~LinkedStack(){makeEmpty();} void push(const T&x) { StackNode<T> *p=new StackNode<T> (x,top); top=p; } bool pop(T &x) { if(IsEmpty()==true) return false; x=top->data; StackNode<T> *s=top; top=top->next; delete
s; return ture; } bool getTop(T &x)const { if(IsEmpty()==true) return false; x=top->data; return true; } bool IsEmpty()const {return top==NULL;} void makeEmpty() { StackNode<T> *p; while(top!=NULL) { p=top; top=top->next; delete
p; } } };

(3)迴文類

class paildrome //迴文類
{
private:
    char *str;
    void removeBlankSpace();//過濾判別字元中的空格字元
public: 
    palindrome(char *s)
    {
    str=new char[strlen(s)+1];
    strcpy(str,s);
    }
    bool paildromeJudge();//迴文判別
    void setString(char *s)//重新設定字串
    {
        str=new char[strlen(s)+1];
        strcpy(str,s);
    }
    void pringString(){cout<<str<<endl;}
};

3 演算法設計與實現

(1) 迴文判別
a) 原理:藉助於棧,先將字串中的字元依次入棧,重新掃描字串,並依次與棧頂字元比較,若匹配則棧頂元素出棧,並向後掃描,否則不是迴文,若掃描完畢都匹配則是迴文。
b) 演算法步驟:
i) 初始化,過濾字串中的空格字元;
ii) 將字串中的字元依次入棧S;
iii) 原串字元依次與棧S的棧頂字元比較:
若不匹配,則返回結果“字串不是迴文”,否則棧頂字元出棧。
直到棧空,則返回結果“字串是迴文”。
c) 實現

bool palindrome::palindromeJudge()//迴文判斷
{
removeBlankSpace();
LinkedStack<char> S;
char *p=str,ch;
while(*p) {S.push(*p);p=p+1;} //將字元中str中的字元依次入棧
p=str;
while(!S.IsEmpty())//當棧不為空是
{
    S.pop(ch);
    if(ch!=*p)//棧頂元素與字元中的子父比較,若不匹配
    {
        S.makeEmpty();//釋放棧空間
        return false;//返回不是迴文
    }
    p++;
}
return true//返回時迴文
}

(2)過濾空格字元操作
過濾空格字元的方法很多,可以將字串看成是線性表,掃描線性表,若遇到空格字元就刪除,這種方法優點是簡單、易於理解,缺點是元素前移較多、效率較低。當然也可以採用遇到空格字元自動跳過的方法。這裡採用的是每次只將掃描到的非空格字元前移的方法,效率較高。
a) 原理
p指標是用來掃描字串,s指標是用來指示p所指字元前移的位置,如下圖所示,p指向非空格字元,則將p指向字元前移到s所指位置。
b) 演算法實現

void palindrome::removeBlankSpace()//過濾空格字元
{
    char *s,*p;//p掃描字串,s來指向字元前移的位置
    s=p=str;
    while(*p)
    {
        if(*p==" ") p++;
        else
        {
        if(p!=s) *s=*p;
        p++;
        s++;
        }
    }
    *s='\0';
}

測試程式碼

void main()
{
    char s[20];
    cout<<"please input string s"<<endl;
    cin.getline(s,20);
    palindrome pa(s);
    if(pa.palindromeJudge==true)
            cout<<"迴文"<<endl;
    else
            cout<<"不是迴文"<<endl;
}

相關推薦

資料結構__問題_c++

鏈棧結點結構設計 template<class T> struct StackNode { T data; StackNode<T> *next; StackNode():

資料結構演算法題/最長子串

迴文表示字串正向和反向是相同的。例如a, aba, abccba 一、暴力法 最容易想到的就是暴力破解,求出每一個子串,之後判斷是不是迴文,找到最長的那個。 求每一個子串時間複雜度O(N^2), 判斷子串是不是迴文O(N),兩者是相乘關係,所以時間複雜度為O(N^3)。 二、動態規劃

資料結構以及的實現

線性表有順序儲存結構和鏈式儲存結構,棧屬於線性表的一種,也具有順序儲存結構和鏈式儲存結構。對於棧的鏈式儲存結構,一般稱之為鏈棧。 棧的插入和刪除只在棧頂進行操作,在單鏈表中,頭指標是單鏈表的必須元素;而在棧中,棧頂指標也是鏈棧的必須元素,且一般將棧頂放在單鏈表

資料結構】使用和佇列判斷字串是否是

原題目:   假設稱正讀和反讀都相同的字元序列為“迴文”,例如,‘abba’和‘abcba’是迴文,‘abcde’和‘ababab’則不是迴文。試寫一個演算法判別讀入的一個以‘@’為結束符的字元序列是否是“迴文”。 原始碼: // *.cpp: 定義控制檯應用程式的入口

資料結構課後習題答案_基礎題1

#include<stdio.h> #include<stdlib.h> struct LinearList { int *list; int size; int MaxSize; }; typedef struct LinearList LIST; void Init

資料結構

#include<stdio.h> #include<stdlib.h> typedef int Elemtype; typedef struct node        //定義結點 {     Elemtype data;     struct n

資料結構的實現(C語言)

棧的鏈式儲存稱為鏈式棧,鏈式棧是一種特殊的單鏈表,它的插入和刪除規定在單鏈表的同一端進行。鏈式棧的棧頂指標一般用top表示。(個人理解:相當於只對單鏈表的第一個結點進行操作) 鏈式棧要掌握以下基本操作: 1、建立一個空鏈式棧 2、判斷鏈式棧是否為空 3、讀鏈式棧的

資料結構作業8--的應用與遞(選擇題)

2-1令P代表入棧,O代表出棧。若利用堆疊將中綴表示式3*2+8/4轉為字尾表示式,則相應的堆疊操作序列是: (3分) A.PPPOOO B.POPOPO C.POPPOO D.PPOOPO 作者: DS課程組 單位: 浙江大學

資料結構之-及其常見應用(進位制轉換、括號匹配、行編輯程式、表示式求值等)

1、棧的概念 棧(stack)又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧

DS之順序隊實現判斷

        順序棧和鏈隊的基本操作就不再一一列舉了,要想實現迴文判斷,先來了解什麼是迴文?“迴文”一字串正著讀和反著讀是相同的字元序列,如“abcba”,"abba"為"迴文",“abab”則不是“迴文”。         其次就是順序棧和鏈隊如何實現迴文的判斷?將輸入

資料結構學習筆記-式儲存(C語言實現)

棧是一個特殊的線性表,後進先出,既然是線性表,就會分為順序儲存和鏈式儲存,下面就是棧的鏈式儲存部分,也稱作鏈棧。單鏈表是有頭指標頭節點的,通常鏈棧的棧頂就相當於頭指標,因為初始化的鏈棧是空的,即top=

資料結構的一些基本操作

鏈式棧是一種資料儲存結構,可以通過單鏈表的方式來實現,使用鏈式棧的優點在於它能夠克服用陣列實現的順序棧空間利用率不高的特點,但是需要為每個棧元素分配額外的指標空間用來存放指標域。 標頭檔案 LinkS

資料結構)線性表_多項式相加1_模仿

#include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef int ElemType; typedef struct Node *PloyNode; typede

資料結構的C實現__鄰接表示

//圖,用鄰接表表示 //編譯環境:Dev C++5.11 //ALGragh.c #include <stdio.h> #include <stdlib.h> #define ERROR 0 #define OK 1 #define MAX_VERTEX_NUM  10 #defin

郝斌資料結構入門---P30---

郝斌資料結構入門---P30---棧   線性結構的常見應用之一:棧(只能頭部插入,頭部刪除) 定義:一種可以實現“ 先進後出 ”的儲存結構,棧類似於箱子 分類:靜態棧,動態棧 演算法:出棧pop,入棧push(壓棧) 應用:函式呼叫,中斷,表示式求值,記憶體分配,

資料結構——第二章、佇列:01

1.棧和佇列是限定插入和刪除只能在表的端點進行的線性表。棧是後進先出的資料結構,佇列是先進先出的資料結構(棧相當於一個瓶子,向瓶內放的物品被壓到瓶子底部,只有等上面的所有物品都出來了,下面的才能出來,這是先進後出;佇列相當於一個隧道,火車向隧道內開不能回頭,車頭先進去也先出來,這是先進先出)。 2.棧的型別

資料結構--雙

文章目錄 double_linklist.h double_linklist.c main.c 執行結果 double_linklist.h #ifndef __DOUBLE_LINKLIST_H__ #define

資料結構實驗之與佇列二:一般算術表示式轉換成字尾式(SDUT 2132)

題目連結 #include <bits/stdc++.h> using namespace std; typedef long long ll; int ok(char ch, char sh) { if(sh == '(')return 1; if((ch ==

資料結構實驗之與佇列六:下一較大值(二)(SDUT 3333)

#include <bits/stdc++.h> using namespace std; int a[1000006]; int b[1000006]; int sta[100006]; int main() { int t,n,i,j,top; while(~sc

資料結構實驗之與佇列五:下一較大值(一)(SDUT 3332)

#include <bits/stdc++.h> using namespace std; int a[1005]; int main() { int t,n,i,j; while(~scanf("%d",&t)) { while(t-