資料結構之棧和佇列面試題(4)乙個陣列實現兩個棧

2021-08-19 18:14:56 字數 3167 閱讀 3256

乙個陣列實現兩個棧意思就是共享棧,怎麼實現。具體大約有三種方法

方法一: 兩個棧從陣列的中間開始,分別向陣列第乙個元素,和陣列最後乙個元素方向入棧,到達邊界就說明棧滿了

方法二:兩個棧分別從陣列的開頭和結尾開始向中間,當兩個棧相遇,就說明棧滿了

方法三:從第零個位置開始偶數是乙個棧,奇數是乙個棧,當到達陣列最後乙個元素的時候,說明棧滿了

綜合上面幾個方法,我們可以知道,方法二是最簡單的,所以我們採取第二種方法來建立共享棧

下面是具體的**實現

#pragma once 

#include

#inlcude

#include

#define maxsize 10000

#define header printf("\n**********==%s**********=\n",__fuction__)

typedef char stacktype;

typedef struct sharestacksharestack;

void sharestack1init(sharestack *s);//初始化

void sharestack2init(sharestack *s);

void sharestack1destroy(sharestack *s);//銷毀棧

void sharestack2destroy(sharestack *s);

void sharestack1push(sharestack *s);//入棧

void sharestack2push(sharestack *s);

void sharestack1pop(sharestack *s);//出棧

void sharestack2pop(sharestack *s);

int sharestack1top(sharestack *s,stacktype *value);//取棧頂元素

int sharestack2top(sharestack *s,stacktype *value);

做好的相關的工作,就要開始一一實現我們的功能了

初始化函式

#include

#include

"sharestack.h"

void sharestack1init(sharestack *s)

s->stack1 =0;}

void sharestack2init(sharestack *s)

s->stack2 = maxsize;

}

列印函式

void print1(sharestack *s)

if(s->stack1 == 0 || s->stack2 == 0)

size_t i = 0;

for(;i < s->stack1;i++)

printf("\n");

}void print2(sharestack *s)

if(s->stack2 == maxsize || s->stack1 == maxsize)

size_t i = maxsize-1;

for(;i >= s->stack2;i--)

printf("\n");

}

入棧函式

void sharestack1push(sharestack *s,stacktype value)

if(s->stack1 >= s->stack2)

s->data[s->stack1++] = value;

}void sharestack2push(sharestack *s,stacktype value)

if(s->stack2 <= s->stack1)

s->data[--s->stack2] = value;

}

出棧函式

void sharestack1pop(sharestack *s)

if(s->stack1 ==

0|| s->stack2 ==

0)

--s->stack1;

}void sharestack2pop(sharestack *s)

if(s->stack2 == maxsize || s->stack1 == maxsize)

++s->stack2;

}

取棧頂元素

int sharestack1top(sharestack *s,stacktype *top)

if(s->stacl1 == 0 || s->stack2 == 0)

*top = s->data[s->stack1-1];

return1;}

int sharestack2top(sharestack *s,stacktype *top)

if(s->stack2 == maxsize || s->stack1 == maxsize)

*top = s->data[s->stack2];

return

1;}

銷毀棧

void sharestack1destroy(sharestack *s)

s->stack1 =0;}

void sharestack2destroy(sharestack *s)

s->stack2 = maxsize;

}

下面是測試函式以及結果驗證

如有錯誤請指出,謝謝

資料結構之棧和佇列面試題(2)兩個棧實現乙個佇列

我們怎麼用兩個棧來實現乙個佇列呢?首先我們都知道,棧和佇列的 出棧和出佇列是不一樣的,棧是後入先出,佇列是先入先出。所以我們的思路是,用兩個棧,乙個input,乙個output,我們每次想入棧的時候就先將output裡面的元素依次出棧然後往input裡面依次入棧,這個時候,input棧頂元素就是最後...

資料結構 棧面試題 兩個佇列實現乙個棧

上篇文章寫了用兩個棧實現乙個佇列,這篇文章實現用兩個佇列實現乙個棧,其實兩者的思想都是差不多的。下邊繼續畫圖說明 下邊給出實現 includetemplateclass stack else if q1.empty q1不空就push進q1 q1空,q2不空 直接放入q1,這樣pop的話可能更方便一...

資料結構 棧和佇列及其面試題

1.利用順序表實現棧 函式介面 typedef int sdatatype typedef struct stack stack 初始化 void stackinit stack pstack 壓棧 void stackpush stack pstack,sdatatype data 出棧 void...