請(qǐng)用一個(gè)數(shù)組實(shí)現(xiàn)兩個(gè)堆棧, 要求最大地利用數(shù)組空間, 使數(shù)組只要有空間入棧操作就可以成功憋沿。
思路:使這兩個(gè)棧分別從數(shù)組的兩頭開始, 并向中間增長(zhǎng)沪猴; 當(dāng)兩個(gè)棧的棧頂指針相遇(不是相等)時(shí)辐啄, 表示兩個(gè)棧都滿了采章。
IMG_20170628_183147.jpg
偽碼實(shí)現(xiàn):
#define MAXSIZE 10 //存儲(chǔ)元素的最大個(gè)數(shù)
#define bool int
#define True 1
#define Flase 0
typedef struct {
element_type data[MAXSIZE];
int top1;
int top2;
} stack;
stack s; // 聲明結(jié)構(gòu)變量 s
// 兩個(gè)棧為空的位置
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;
}
// 判斷兩個(gè)堆棧是全否為空
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;
}