乙個陣列實現兩個棧
用乙個陣列實現兩個棧,有多種方法,但基本思路就下面三種方法,幾種演算法的實現區別不大,主要在與擴容時的條件,
第一種:以中間向兩邊壓棧:
可以採用兩個棧底分別在陣列中間,棧頂向兩邊移動,當兩個棧頂任意乙個到達陣列的兩邊時,陣列擴容。
此種演算法有兩個擴容條件,二者滿足其一便擴容:即只要有一邊棧頂到達終端的時候就擴容。
第二種:兩邊向中間壓棧
兩個棧的棧底分別在陣列的兩邊,壓棧時棧頂向中間靠攏,當兩個棧頂相遇時,陣列擴容。
(在實際情形中,我們在使用拷貝構造和賦值時往往只在意是否拷貝到了自己想要的資訊,並不在乎空間的開闢,而且使用者根本也不知道內部是如何實現的,所以提高效率還是很有必要的)但我這裡一開始並沒有考慮那麼多,我是直接將陣列的內容直接拷貝上去。
第三種:分奇偶方式壓棧
採用交叉索引的方法,兩個棧分別擁有陣列下標奇偶的空間,暫且把他們叫做奇數棧和偶數棧,把陣列空間開闢為偶數(capacity),當偶數棧的棧頂到capacity-1或奇數棧的棧頂到達capaaity-2時陣列擴容
同樣此種演算法擴容條件有兩個,滿足任意乙個便擴容
條件1:偶數棧的棧頂到capacity-1
條件2:奇數棧的棧頂到達capaaity-2
分析:第一種和第三種明顯在擴容時考慮的情況比較複雜,條件更多一些。
空間使用率:第一種和第三種方法在其中乙個棧壓入比較多的資料而另外乙個棧資料很少時,就存在非常大的空間浪費,但方案二就可以很好的避免這一情況,空間利用率比較高,而且這種方案在乙個棧pop的空間另乙個棧可以使用,可以在一些情況下減少開闢空間的次數(畢竟在c++中動態開闢空間還是很耗時的)
我用的是第二種方式:
#pragma once
#include
#include
using
namespace
std;
//乙個陣列實現兩個棧
//棧是一種資料結構,和記憶體中的堆疊並不是同乙個
template
class arraystack //實際上是棧
~arraystack()
}arraystack(arraystack& arr) //拷貝構造的仍然是乙個陣列
: _size(arr._size)
, _capacity(arr._capacity)
, _size2(arr._size2)
, _sz(arr._sz)
}arraystack& operator =(arraystackarr)
public:
void arr1_push_back(t d)
void arr2_push_back(t d)
void arr_display()
cout
<< endl;
}void arr1_display()
cout
<< endl;
}void arr2_display()
cout
<< endl;
}void arr1_pop_back()
void arr2_pop_back()
private:
void check_cap()
while (s--)
delete _arr1;
_arr1 = tmp;
_capacity = t_capacity;
// _sz = _capacity-1; //同理,只要一擴容,_sz就會回到末端的位置,末端元素就會被覆蓋
_arr2 = &_arr1[_capacity - 1];//只要一擴容就會末端元素在插入新的元素會被覆蓋}}
protected:
t* _arr1;
t* _arr2;
int _size;
int _size2;
int _capacity;//容量是兩棧共有
乙個陣列實現兩個棧
題目 乙個陣列a 1.n 來實現兩個棧,使得兩個棧中的元素總和不到n時,兩個都不會發生上溯。思路 1 建立乙個陣列,分別從兩邊開始,依次往中間走。思路 2 建立乙個陣列,乙個走奇數字,乙個走偶數字。奇偶方式 define crt secure no warnings includeusing nam...
乙個陣列實現兩個棧
乙個陣列實現兩個棧,和 共享棧其實是很類似的。有兩種方式實現 看圖就知道 一種是兩個棧增長方向一樣的 另一種起始位置分別在棧的兩端,往中間增長。方法一 增長方向一樣 方法 把陣列下標分為奇數和偶數 分別給兩個棧使用 如下 我在程式中注釋的 部分,可以放開 看看是什麼效果,注釋掉的那部分是我剛開始的想...
乙個陣列實現兩個棧
用乙個陣列實現兩個棧 方案一 奇偶下標依次儲存 將陣列下標為0的位置作為第乙個棧的棧底,下標為1的位置作為第二個棧的棧底,將整個陣列中偶數下標部分依次儲存在第乙個棧中,將陣列中奇數下標部分依次儲存在第二個棧中。方案二 從中間分別向兩邊壓棧 將陣列的中間位置看做兩個棧的棧底,壓棧時棧頂分別向兩邊移動,...