1. 程式人生 > >用陣列和連結串列分別實現棧類stack,隊queue

用陣列和連結串列分別實現棧類stack,隊queue

棧(stack)是一種常見資料結構,以後進先出(LIFO)著稱。比如編譯器用棧處理函式呼叫,儲存被呼叫函式的引數和區域性變數。當一個函式呼叫另一個函式時候,新的函式引數和區域性變數被入棧。呼叫結束,佔用的資源從棧釋放。

用陣列實現:

class vector{
private:
  T *ele;
int size;
int cap;
public:
	vector<T>(){size=0;cap=16;ele=new T[cap];}
	void sure(){if(size>cap) {T*old=ele;
	cap=2*size;
	ele=new T[cap];
	for(int i=0;i<size;i++)
	  ele[i]=old[i];
	delete old;}
	}
void push_back(T x);
void pop_back();
int size1();
T at(int index);  
bool empty();
void clear();
void swap(vector<T> &v1);};
template<typename T>
void vector<T>::push_back(T x){
sure();
ele[size++]=x;}
template<typename T>
void vector<T>::pop_back(){
if(empty()) throw runtime_error("empty");
--size;}
template<typename T>
int vector<T>::size1(){
return size;}
template<typename T>
T vector<T>::at(int index){
if(empty()||index>cap) throw runtime_error("empty");
return ele[index];}
template<typename T>
bool vector<T>::empty(){
if(size==0) return true;
else return false;}
template<typename T>
void vector<T>::clear(){
	while(!empty()){
	pop_back();}
}
template<typename T>
void vector<T>::swap(vector<T> &v1){
	int len=v1.size1();
	if(len>=size){
		T *p=new T[len];
for(int i=0;i<size;i++)
{p[i]=ele[i];}
clear();
for(int i=0;i<len;i++)
	push_back(v1.at(i));
	v1.clear();
for(int i=0;i<len;i++)
{v1.push_back(p[i]);}}
	else{
	T *p=new T[size];
for(int i=0;i<size;i++)
{p[i]=ele[i];}
clear();
for(int i=0;i<len;i++)
{ele[i]=v1.at(i);}
v1.clear();
for(int i=0;i<size;i++)
{v1.push_back(p[i]);}
	}
}
用棧實現:
#include"15.h"//包含linklist類定義
using namespace std;
template<typename T>
class stack1{
private:
   linklist<T> li;
public:
stack1();
bool isempty();
T peek();
void push(T val);
T pop();
int getsize1();};

//define
template<typename T>
stack1::stack1(){}
template<typename T>
bool stack1<T>::isempty(){
return li.empty();}
template<typename T>
T satck1<T>::peek(){
if(isempty()) throw runtime_error("empty");
return li.getlast();}
template<typename T>
void stack1<T>::push(T val){
li.addlast(val);}
template<typename T>
T stack1<T>::pop(){
	return li.removelast();}
template<typename T>
int stack1<T>::getsize1(){
return li.getsize();}
可以發現,定義好連結串列類Linklist後,實現其他的資料結構比如:stack類非常簡單,常見的就是根據stack類LIFO準則在連結串列尾部各種操作即可。stack類的介面(各種成員函式和建構函式不變),只是具體實現是連結串列而不是陣列。這也側面體現了封裝的好處,使用者只需考慮介面如何使用,內部任便何種實現!

由此可以得到啟發,用連結串列實現隊的實現,與stack的LIFO不同,queue是FIFO機制,根據此類機制實現:

template<typename T>
class queue{
private:
  linklist<T> list;
public:
	queue(){}
    void enqueue(T val);
    T dequeue();
int getsize();};
template<typename T>
void queue<T>::enqueue(T val){
	list.addlast(val);}
template<typename T>
T queue<T>::dequeue(){
return list.removefirst();}
template<typename T>
int queue<T>::getsize(){
	return list.getsize();}


相關推薦

陣列連結串列分別實現stackqueue

棧(stack)是一種常見資料結構,以後進先出(LIFO)著稱。比如編譯器用棧處理函式呼叫,儲存被呼叫函式的引數和區域性變數。當一個函式呼叫另一個函式時候,新的函式引數和區域性變數被入棧。呼叫結束,佔用的資源從棧釋放。 用陣列實現: class vector{ priva

c++分別陣列連結串列實現的操作

棧在實際程式設計中經常會用到,本文利用陣列和連結串列分別實現了棧的操作。 1.陣列方式實現如下: #include<iostream> using namespace std; template <class T> class arraysta

陣列連結串列實現

完成一個棧總共需要完成以下操作:初始化入棧出棧檢視棧頂元素檢視棧的容量清空棧。首先是簡單的,用陣列做的,會有越界的可能。#include <stdio.h> #include <stdlib.h> typedef struct Stack {

分別陣列連結串列實現

    為了更好的理解棧的原理,本文分別用陣列和連結串列實現了棧,     1 陣列實現棧: /* @ brife:陣列實現棧類 */ #include <Windows.h> #ifndef ARRAYSTACK_H #define ARRAYST

陣列連結串列兩種方式實現佇列

手寫陣列實現佇列 1 int queue[20]; 2 int front,rear; 3 4 void clear() 5 { 6 front = rear = -1; 7 } 8 9 int size() 10 { 11 return (rear-front)

分別列表連結串列實現

#!/usr/bin/python3 class StackUnderflow(ValueError):     pass class ListStack():     def __init__(self):      

佇列分別列表連結串列實現

#!/usr/bin/python3 class QueueUnderflow(ValueError):     pass class ListQueue():  #列表實現迴圈佇列類     def __init__(self, len_

基於陣列連結串列兩種方式實現

棧是一種先進後出的資料結構,在實際程式設計棧有很廣泛的用處,Java棧已經幫我們實現好了stack類。 實現棧的兩種方式,基於陣列實現和基於連結串列實現。 1.stack介面 public interface StackADT { //入棧操作 public voi

使用陣列連結串列的方式實現

使用 陣列和連結串列 的方式實現 棧 陣列實現棧: public class Stack<Item> implements Iterable<Item> { pri

陣列連結串列佇列之間的關係及堆之間的關係

本屌最近在學習資料結構過程中,由於連續看了陣列,棧,佇列,連結串列等,一時混雜,下面摘取參考資料,供自己學習使用。 第一部分:介紹了資料儲存結構和資料結構的區別,以及連結串列和陣列的差異。 第二部分:介紹了堆和棧的區別。 (1)資料儲存結構:計算機的一個概念,描述資料在計算機中儲存方式;常用

一元多項式求和的兩種實現陣列連結串列

一元多項式求和一般都是有兩種實現方式,小編下面就附上我對這兩種方式的理解和實現程式碼。 1.陣列實現。這種方式實現一元多項式加法,是把陣列下標當做一元多項式的指數,在陣列中存放係數。這種方式在實現一元多項是加法是通過遍歷陣列下標來獲取指數資訊,通過指數資訊將係數進行相加。利用陣列在實現一元多項式

陣列連結串列集合的區別應用場景以及堆的區別

陣列和集合的區別: 1.陣列的長度固定的,超過長度時,只能建立一個新的陣列,並把舊的陣列的值傳進去方可; 而集合的長度是動態不固定的。 2.陣列的儲存型別是單一的,同一陣列只能儲存同一資料型別的資料。 而集合可以儲存多鍾資料型別的資料。 3.陣列只能通過下標來訪

C++實現陣列連結串列的排序演算法

OK,我們經常會用到排序演算法。那麼,常用的排序演算法,除了使用陣列之外,用連結串列又該如何處理呢?下面我們來做個對比: //使用插入排序對陣列進行排序 int *get_order(int *num, int length) { for(int eiter = 1; eiter <

陣列連結串列描述以及應用

陣列描述棧#pragma warning(disable:4996) #include <iostream> #include<iterator> #include<algorithm> using namespace std; //邊長

HashMap實現原理利用陣列連結串列儲存元素

陣列:儲存區間連續,佔用記憶體嚴重,定址容易,插入刪除困難 連結串列:儲存區間離散,佔用記憶體比較寬鬆,定址困難,插入刪除容易 hashmap綜合應用了這兩種資料結構,實現了定址容易,插入刪除也容易 HashMap結構示意圖: 實現原理:用一個數組來儲存元素,但是這

python實現陣列連結串列的歸併排序

    歸併排序是一種穩定的排序,採用分而治之策略,可以用於順序儲存結構,也易於在連結串列上實現。其原理如下圖:    演算法時間複雜度為  O(nlogn),空間複雜度為 O(n)。1 在陣列上實現d

佇列的陣列連結串列實現

1.佇列是先入先出額資料結構,它的實現可以用陣列,也可以用連結串列。用陣列實現連結串列時,需要預先分配陣列的大小,用front和rear下標分別表示隊頭元素下標和隊尾元素下標,插入一個元素時,使隊尾的下標rear加1,刪除一個元素時,front下標加1,判斷是否為空的佇列只

演算法總結-陣列連結串列

1 連結串列 Dummy Node的應用 K組翻轉連結串列 http://www.lintcode.com/zh-cn/problem/reverse-nodes-in-k-group/ 連結串列劃分 http://www.lintcode.com/zh-cn/probl

資料結構之——陣列連結串列

1. 陣列 1.1 陣列為什麼從零編號? 陣列名代表陣列的首地址,陣列的下標其實代表陣列中某個元素相對首地址的偏移量,陣列的第一個元素是零偏移,因此從 0 開始。 上面其實也只是一個解釋, C 語言設計者用零開始編號,後來的各種語言也便紛紛效仿,因此就形成了這個習慣。 1

陣列連結串列的區別與優缺點

1.儲存    陣列儲存必須有提前宣告空間,因為陣列的儲存是連續的,沒有足夠的空間是無法儲存陣列的。  連結串列可以將資料儲存在不連續的空間中,從第一個空間開始,連結串列會記錄下下一個空間的位置,這樣就能檢索到整條連結串列了 2.查詢 根據陣列的特有屬性,只要找到第