資料結構棧 佇列演算法

2021-08-07 21:52:12 字數 3179 閱讀 4469

[cpp] view plain copy

#include

#include

#include

#include

#include

//兩個棧實現佇列  

using namespace std;  

template

class  queue  

int size()  

bool empty(){};  

void push(t value)  

t front();  

return empty;  

r lhs = fun(t->l);  

r rhs = fun(t->r);  

r r1;  

r1.n = max(lhs.n, rhs.n + 1);  

r1.m = max(max(lhs.m,rhs.m),lhs.n+rhs.n+2);  

return r1;  

//二叉搜尋樹的判斷  

//1.遞迴中序遍歷,然後判斷是否遞增數列  

//2.如下,非常簡潔的方法  

bool isbst(binary* t)  

int min = -(1 << 31);  

int max = 1 << 31 - 1;  

bst(t, min, max);  

bool bst(binary* t,int min,int max)  

if (t == null)  

return true;  

if (t->value>min&&t->valuereturn bst(t->l, min, t->value) && bst(t->r, t->value, max);  

else   

return false;  

//平衡二叉樹判斷  

bool isbalanced1(binary* t)  

if (t==null)  

return true;  

int left = binarydepth(t->l);  

int right = binarydepth(t->r);  

int diff = left - right;  

if (diff>1||diff<-1)  

return false;  

return isbalanced1(t->l) && isbalanced1(t->r);  

bool isbalanced2(binary* t,int* depth)  

if (t==null)  

*depth = 0;  

return true;  

int left, int right;  

if (isbalanced2(t->l, &left) && isbalanced2(t->r, &right))  

int diff = left - right;  

if (diff <= 1 && diff >= -1)  

*depth = 1 + (left > right ? left : right);  

return true;  

else  

return false;  

else  

return false;  

int maxdepth(binary* t)  

if (t==null)  

return 0;  

return max(maxdepth(t->l), maxdepth(t->r)) + 1;  

int mindepth(binary* t)  

if (t == null)  

return 0;  

return min(mindepth(t->l), mindepth(t->r)) + 1;  

bool isbalanced3(binary* t)  

if (maxdepth(t) - mindepth(t)<=1)  

return true;  

else   

return false;  

//大根堆  

//1.大根堆的初始化

,l表示陣列從

a[0]-a[l];  

void buildmaxheap(int a, int l)  

void adjustdown(int a, int i, int l);  

for (int i = l / 2; i > 0;i--)  

adjustdown(a, i, l);  

void adjustdown(int a, int k, int l)  

//k為父節點,i,

i+1為子節點  

a[0] = a[k];  

for (int i = 2 * k; i <= l;i*=2)  

//取子節點中較大者  

if ((i < l) && a[i] < a[i + 1])  

i++;  

if (a[0]>=a[i])  

break;  

else  

//子節點上移  

a[k] = a[i];  

k = i;  

//被賽選節點值放入最終位置  

a[k] = a[0];  

//k是需要調整節點的下標位置  

void adjustup(int a, int k)  

a[0] = a[k];  

for (int i = k / 2; i > 0;i--)  

if (a[0]break;  

else  

a[k] = a[i];  

k = i;  

a[k] = a[0];  

//插入  

void maxheapinsert(int a, int t, int l )  

a[l+1] = t;  

adjustup(a,l+1);  

//刪除最大元素  

void maxheapdelete(int a, int l)  

//破壞堆結構,在進行向下調整操作  

a[1] = a[l];  

a[l] = 0;//即為刪除  

adjustdown(a, 1,l-1);  

佇列 棧(資料結構與演算法)

佇列是一種先進先出 fifo 的資料結構,從隊尾進,從隊頭出 在 fifo 資料結構中,將首先處理新增到佇列中的第乙個元素。如上圖所示,佇列是典型的 fifo 資料結構。插入 insert 操作也稱作入隊 enqueue 新元素始終被新增在佇列的末尾。刪除 delete 操作也被稱為出隊 deque...

資料結構 棧 佇列

二 佇列 注 鏈式儲存 定義鍊錶元素所儲存的資料型別 以int為例 typedef int elemtype 定義棧的結點結構及結點指標型別 typedef struct stacknode stacknode,stacknodeptr 定義指向棧的結構 typedef struct linksta...

資料結構與演算法 棧和佇列

棧 是限制在表的一端進行插入和刪除運算的線性表。棧又稱後進先出簡稱lifo表 佇列 也是一種運算受限的線性表。它只允許在標的一端進行插入,而在另一端進行刪除。佇列亦稱先進先出fifo表 1.棧與佇列的區別 1 佇列先進先出,棧先進後出。2 對插入和刪除操作的 限定 棧是限定只能在表的一端進行插入和刪...