請用一個數組實現兩個堆棧, 要求最大地利用數組空間, 使數組只要有空間入棧操作就可以成功。
思路:使這兩個棧分別從數組的兩頭開始, 并向中間增長; 當兩個棧的棧頂指針相遇(不是相等)時, 表示兩個棧都滿了。
IMG_20170628_183147.jpg
偽碼實現:
#define MAXSIZE 10 //存儲元素的最大個數
#define bool int
#define True 1
#define Flase 0
typedef struct {
element_type data[MAXSIZE];
int top1;
int top2;
} stack;
stack s; // 聲明結構變量 s
// 兩個棧為空的位置
s.top1 = -1;
s.top2 = MAXSIZE;
// 入棧
void push(stack *s, element_type item, int tag)
{
if ((s->top2) - (s->top1) != 1){
// 選擇要操作的棧
if (tag == 1){
s->data[(s->top1)+1] = item; // 向右填充
s->top1++;
} else {
s->data[(s->top2)-1] = item; // 向左填充
s->top2--;
}
}
}
// 出棧
element_type pop(stack *s, int tag)
{
element_type n = NULL;
if (tag == 1){
if (s->top1 != -1){
n = s->data[(s->top1--)];
}
} else {
if (s->top2 != MAXSIZE){
n = s->data[(s->top2--)];
}
}
return n;
}
// 判斷兩個堆棧是全否為空
bool is_empty(stack *s, int n)
{
bool flag = False;
if ((s->top1 == -1) && (s->top2 == n)){
flag = True;
}
return flag;
}
// 判斷是否滿了
bool is_full(stack *s)
{
bool flag = False;
if (s->top2 - s->top1 == 1){
flag = True;
}
return flag;
}