使用乙個陣列實現兩個棧 佇列和棧面試題4

2021-08-19 05:13:28 字數 3031 閱讀 6418

使用乙個陣列來實現兩個棧結構,即共享棧

對於這個問題,我們有兩種解法

1. 方法一:

定義兩個區間(0,top1],[top2,0),分別表示連個棧的範圍,兩個棧由兩側向中間生長,棧滿的條件為 top1 == top2

2. 方法二:

將陣列從中間平均一分為二,棧由中間向兩側生長

明顯方法一優於方法二,因為方法二可以做到最大程度的利用到陣列的所有空間,沒有浪費,所以這裡我們使用方法一來解決這個問題

這裡我們要用到棧的一些操作,對於棧的概念和操縱還不太理解的可以移步

順序表實現的資料結構棧

因為棧不是我們求解這個問題的主要難點,所以選擇了比較簡單的順序棧來做載體,如果想對其他方法實現棧有個深入地了解,可以參考

鍊錶實現的資料結構棧及相關函式

#pragma once

// 引入順序表實現的棧相關函式

#include "seqstack.h"

#define datatype char

typedef struct sharedstack sharedstack;

// 初始化

void sharedstackinit(sharedstack* sharedstack);

// 入棧

void sharedstackpush(sharedstack* sharedstack, int stacknumber, datatype value);

// 出棧

void sharedstackpop(sharedstack* sharedstack, int stacknumber);

// 取棧頂元素

int sharedstacktop(sharedstack* sharedstack, int stacknumber, datatype* value);

.c 實現包含了單元測試模組,可以通過條件編譯將其關閉

#include "sharedstack.h"

// 初始化

void sharedstackinit(sharedstack* sharedstack)

sharedstack->size = 1000;

sharedstack->top1 = 0;

sharedstack->top2 = sharedstack->size;

sharedstack->data = malloc(sizeof(datatype)*sharedstack->size);

}// 入棧

void sharedstackpush(sharedstack* sharedstack, int stacknumber, datatype value)

switch(stacknumber)

sharedstack->data[sharedstack->top1++] = value;

return;

}break;

case

2: sharedstack->data[--sharedstack->top2] = value;

return;

}default:

perror("stacknumber error");

return;

}}// 出棧

void sharedstackpop(sharedstack* sharedstack, int stacknumber)

switch(stacknumber)

sharedstack->top1--;

return;

}break;

case

2: sharedstack->top2++;

return;

}default:

perror("stacknumber error");

return;

}}// 取棧頂元素

int sharedstacktop(sharedstack* sharedstack, int stacknumber, datatype* value)

switch(stacknumber)

*value = sharedstack->data[sharedstack->top1-1];

return

1; }

break;

case

2: *value = sharedstack->data[sharedstack->top2];

return

1; }

default:

perror("stacknumber error");

return

0; }

}#if 0

/* *******************************************

* ******************* test ******************

* *******************************************/

#include

#define function() printf("\n******************** %s ***************===\n\n", __function__)

void print(sharedstack stack, const

char* msg) else

}if(stack.top2 == stack.size) else

}}// 入棧測試

void testpush()

// 出棧測試

void testpop()

// 獲取棧頂元素測試

void testtop()

int main()

#endif

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

stack 後進先出 lifo 是在表的一端進行插入或刪除運算的線性表,我們把插入 刪除的這一端稱為棧頂 top 另一端稱為棧底 bottom e push e item 把元素壓入棧頂並返回此元素 e pop 移除棧頂元素並返回此元素 e peek 檢視棧頂元素而不移除它 boolean empt...

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

棧的特性 先進後出 filo 佇列的特性 先進先出 fifo 1 兩個棧實現乙個佇列 1 思路 入棧時,直接壓入棧1中 如果棧1滿了,判斷棧2是否為空,若為空,則將棧1元素全部倒入棧2,再入棧 若棧2不為空,則不能再入元素 出棧時,判斷棧2是否為空,若棧為空,則將棧1中的元素倒入棧2,否則直接彈出棧...

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

在這裡我們先說明一下,我們在此 中用到的棧和佇列都是stl庫中實現的 思路 兩個棧,stark1和stark2,將stark1作為儲存空間,stark2作為零時快取區。入隊時,將入隊元素全部壓入stark1中即可。出隊時,將stark1中的元素全部pop出來壓入stark2中,然後在全部pop出來就...