鍊錶實現的棧可以克服在程式執行時也無法估計棧容量大小的情況;
棧中的元素是儲存在稱為節點的類中,每個節點都包含乙個資料域和乙個指標域;資料域儲存棧的值,指標域指示棧中下乙個值得位置;而棧類的資料成員是需要乙個指向棧頂的指標即可;
類宣告如下:
typedef int stackelement;
class stack
};typedef node * nodepointer;
nodepointer mytop;
};
由類宣告可知,建立乙個空棧只需令mytop為空指標來表示他沒有指向任何節點即可;
相應的 empty 函式就只需要檢查mytop是否為 0 來判斷棧是否為空;
push 函式:(1)建立乙個節點,(2)把節點的指標域指向mytop指示的位置並同時把資料域賦插入的值;(3)mytop指向新節點;
**:mytop = new (nothrow) stack::node (item,mytop);
提取棧頂元素和基於陣列的棧一樣;而刪除棧的實現,也相差無幾;只需令另乙個指標指向棧頂指標,然後棧頂指標下移,最後刪除另乙個指標即可:stack::nodepointer ptr = mytop; mytop = mytop-> next; delete ptr;
遍歷棧元素的**:
stack::nodepointer currptr = mytop,nextptr;
while (currptr)
具體實現**:
#include using namespace std;
typedef int stackelement;
class stack
};typedef node * nodepointer;
nodepointer mytop;
};// 建構函式
stack::stack () : mytop (0) {}
// 複製建構函式
stack::stack (const stack & original) }}
//賦值運算子的定義
const stack & stack::operator = (const stack & right)
} }return *this;
}// 析構函式
stack::~stack ()
}bool stack::empty () const
void stack::push (const stackelement item)
void stack::display (ostream & out) const
stackelement stack::top () const }
void stack::pop ()
else
cerr << "stack is empty\n";
}int main ()
cout << "stack created.empty ?\n" << (s.empty ()?"yes":"no") << endl;
cout << "stack is : \n";
s.display (cout);
cout <<"created stack u,v;u=v=s: \n";stack u,v;
u = v = s;
cout << "u: \n";
u.display (cout);
cout << "poping v:\n";
while (!v.empty ())
cout << "stack created.empty ?\n" << (v.empty ()?"yes":"no") << endl;
return 0;
}
資料結構 棧 鍊錶的實現
鍊錶的實現和陣列的實現最大的不同在於鍊錶的插入操作代價要低於陣列,不過總體代價還是陣列更低,因為鍊錶的構造和連線部分代價其實很高。基本結構 private node head null push操作 public void push string str pop操作 public string po...
資料結構 棧的鍊錶實現
1.構造結構體作為鍊錶的節點 typedef struct node linkstack 2.建棧操作 為指標s分配一塊空間,返回後作為鍊錶的頭節點。其後繼為空,表示棧為空。向棧中壓入元素後,它的直接後繼就是棧頂元素。linkstack createstack 3.判斷棧是否為空 int isemp...
資料結構 使用鍊錶實現棧
使用者傳來只傳來e public node e e 使用者沒有傳任何引數 public node override public string tostring 虛擬頭結點 private node dummyhead 記錄鍊錶中有多少個元素 private int size 對於乙個空的鍊錶來說 ...