请用一个数组实现两个堆栈, 要求最大地利用数组空间, 使数组只要有空间入栈操作就可以成功。
思路:使这两个栈分别从数组的两头开始, 并向中间增长; 当两个栈的栈顶指针相遇(不是相等)时, 表示两个栈都满了。
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;
}
网友评论