C 資料結構與演算法 棧

2021-09-09 07:05:13 字數 4368 閱讀 8997

棧,zhan,從木從戔。牲口棚,馬棚。棧的結構是很簡單的,簡單來說就是乙個先入後出的列表。

#pragma once

#include #include #include using namespace std;

class illegalparametervalue :public exception

~illegalparametervalue() {}

};class stackisempty :public exception

~stackisempty() {}

};templateclass cstack

virtual bool empty() const = 0;

virtual int size() const = 0;

virtual t& top() const = 0;

virtual void pop() = 0;

virtual void push(const t& e) = 0;

};templateclass arraystack :public cstack

return os;

}private:

t* element;

int stacktop;

int length;

};templateinline arraystack::arraystack(int _length)

length = _length;

stacktop = -1;

element = new t[length];

}templateinline arraystack::~arraystack()

templateinline int arraystack::size() const

templateinline bool arraystack::empty() const

templateinline t & arraystack::top() const

return element[stacktop];

}templateinline void arraystack::pop()

element[stacktop].~t();

stacktop--;

}templateinline void arraystack::push(const t & e)

stacktop++;

element[stacktop] = e;

}

凡遇(,則進棧;凡遇),則出棧 。

#include "cstack.h"

// 括號匹配

/* 函式:printmatchedpairs

* 功能:列印括號的匹配關係

* input:string expr, 含有括號的表示式

* output:void

* */

void printmatchedpairs(string expr);

int main()

void printmatchedpairs(string expr)

if (expr.at(i) == ')')

else

}} cout << "end!!!" << endl;

cout << endl;

}

3.2 漢諾塔問題漢諾塔是乙個發源於印度的益智遊戲,也叫河內塔。相傳它源於印度神話中的大梵天創造的三個金剛柱,一根柱子上疊著上下從小到大64個**圓盤。大梵天命令婆羅門將這些圓盤按從小到大的順序移動到另一根柱子上,其中大圓盤不能放在小圓盤上面。當這64個圓盤移動完的時候,世界就將毀滅。 

演算法原理參照:

#include "cstack.h"

// 漢諾塔問題

/* 函式:towerofhanoi

* 功能:列印漢諾塔問題的過程

* input:int n, 圓盤的個數

* int x, 柱子x

* int y, 柱子y

* int z, 柱子z

* output:void

* */

arraystackask[3];

void move(int x, int y);

void towerofhanoi(int n, int x, int y, int z);

int main()

towerofhanoi(3, 0, 1, 2);

system("pause");

return 0;

}void move(int x, int y)

}void towerofhanoi(int n, int x, int y, int z)

else

}

所謂地棧混洗,就是根據某種約定地規則,對棧內元素進行重新排序。 

考查棧:a = < a1, a2, ..., an ]、b = s = ø,左端為棧頂

只允許:將 a 的頂元素彈出並壓入 s(s.push(a.pop())),或將 s 的頂元素彈出並壓入 b(b.push(s.pop()))

若經過一系列以上操作後,a 中元素全部轉入 b 中,b = [ a(k1), ..., a(kn) >,右端為棧頂

則稱之為 a 的乙個棧混洗(stack permutation)

原文: 

1. 對任意的i, j, k有[...,[k],...,[j],...,[i],...>必非棧混洗;

2. 不存在...,[k],...,[j],...,[i],...的棧一定可由棧混洗得到。 

#include "cstack.h"

// 混棧洗

/* 函式:ispermutation

* 功能:判斷b是否是a的混棧洗

* input:string _a, 棧a中元素組成的字串

* string _b, 棧b中元素組成的字串

* output:bool ret,b是否是a的混棧洗

* */

bool ispermutation(string _a, string _b);

int main()

bool ispermutation(string _a, string _b)

// a:原始棧,b:待測棧,c:輸出棧,s:中轉棧

// 若bc相等,則b是a的乙個棧混洗

arraystacka, b, c, s;

for (int i = 0; i < _a.size(); i++)

for (int i = 0; i < _a.size(); i++)

else

return false;

} c.push(s.top());

s.pop();

} cout << "a = " << a << endl;

cout << "b = " << b << endl;

cout << "c = " << c << endl;

return true;

}

*******************括號匹配**********************

原始字串: s(ds)(dsd(ds)ds(ds(ds(ds)ds)s

1 與 4 匹配

9 與 12 匹配

21 與 24 匹配

18 與 27 匹配

end!!!

*******************漢諾塔問題**********************

移動: 0-->2

0: 2 1

1:2: 0

移動: 0-->1

0: 2

1: 1

2: 0

移動: 2-->1

0: 2

1: 1 0

2:移動: 0-->2

0:1: 1 0

2: 2

移動: 1-->0

0: 0

1: 1

2: 2

移動: 1-->2

0: 0

1:2: 2 1

移動: 0-->2

0:1:

2: 2 1 0

*******************混棧洗甄別**********************

原始棧:12345

測試棧:35412

n!請按任意鍵繼續. . .

c 資料結構佇列棧屍體 資料結構與演算法 棧與佇列

使用抽象資料型別可以幫助我們更好的理解資料所需的操作,之後再進行具體的資料型別實現。實際上,往往是操作影響著我們決定資料型別該如何實現,這裡有兩種典型的資料結構 棧和佇列。1 棧首先,普通的線性表實現是有兩個埠可以訪問的,但是如果作為棧就要封閉一端,只能訪問另一端。這當然不是自討苦吃,棧是一種抽象資...

資料結構與演算法《棧》

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

棧(資料結構與演算法)

給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true示例 2 輸入 輸出 true示例 3 輸入 輸出 false示例 4 輸入 輸出 false示例 5 輸入 輸出 tr...