能否用兩個棧實現乙個佇列的功能

2021-07-13 12:05:54 字數 1437 閱讀 8570

能否用兩個棧實現乙個佇列的功能

結點結構體: 

typedef struct node 

int data; 

node *next; 

}node,*linkstack;

建立空棧:

linkstack createnullstack( linkstack &s) 

s = (linkstack)malloc( sizeof( node ) ); //申請新結點 ,帶頭結點

if( null == s) 

s->data = 0; //初始化新結點 

s->next = null; 

return s; 

棧的插入函式:設計的是乙個帶頭結點的棧,插入和刪除操作都在頭結點後

linkstack push( linkstack &s, int data)

if( null == s) //檢驗棧 

linkstack p = null; 

p = (linkstack)malloc( sizeof( node ) ); //申請新結點 

if( null == p)

if( null == s->next) 

else

p->data = data; //初始化新結點 

s->next = p; //插入新結點 

return s; 

出棧函式:

node pop( linkstack &s)

node temp; 

temp.data = 0; 

temp.next = null;

if( null == s) //檢驗棧

temp = *s;

if( s->next == null ) 

linkstack p = s ->next; //節點出棧 

s->next = s->next->next; 

temp = *p; 

free( p ); 

p = null; 

return temp;

雙棧實現佇列的入隊函式:

linkstack stacktoqueupush( linkstack &s, int data)

node n;

linkstack s1 = null; 

createnullstack( s1 ); //建立空棧 

while( null != s->next ) //s出棧入s1 

push( s1, data ); //新結點入棧 

while( null != s1->next ) //s1出棧入s

return s; 

說明:用兩個棧能夠實現乙個佇列的功能,那用兩個佇列能否實現乙個佇列的功能呢?結果是否定的,因為棧是先進後出,將兩個棧連在一起,就是先進先出。而佇列是現先進先出,無論多少個連在一起都是先進先出,而無法實現先進後出。

用兩個棧實現乙個佇列功能

1 c 實現 include includeusing namespace std 使用兩個堆疊實現佇列 s1 實現入隊,s2 實現出隊 首先,將資料存放在棧s1中,然後將資料push進s2中,再將s2中的資料pop 出佇列 1 如果棧b不為空,直接彈出棧b的資料 2 如果棧b為空,則依次彈出棧a的...

用兩個棧實現乙個佇列 用兩個佇列實現乙個棧

做題之前,我們先來回顧一下 棧和佇列的相同點以及不同點 便於做題時的應用!1.區別與聯絡 相同點 1 棧和佇列都是控制訪問點的線性表 2 棧和佇列都是允許在端點處進行資料的插入和刪除的資料結構 不同點 1 棧遵循 後進先出 lifo 的原則,即只能在該線性表的一頭進行資料的插入和刪除,該位置稱為 棧...

用兩個棧實現乙個佇列,用兩個佇列實現乙個棧

t deletehead 頭部刪除節點 while s1.empty t ret s2.top s2.pop return ret private stacks1 stacks2 問題2 用兩個佇列實現乙個棧 問題分析 用兩個佇列實現乙個棧,刪除時,由於佇列是先進先出的,而棧是後進先出,因此假設現在...