一个很大的收获是对于函数内调用free的认识加深
引用指针是在栈中复制了一个与原指针相同的镜像,但是二者都是指向同一片空间,free只需要通过参数得到空间的地址,因此效果是一样的,而创建链表时,修改了指针参数,free函数本质上没有修改指针参数
#define STACK_SIZE 10001
typedef struct {
int stack1_len;
int stack2_len;
int* stack1;
int* stack2;
} CQueue;
CQueue* cQueueCreate() {
CQueue* que = (CQueue*)malloc(sizeof(CQueue));
if(!que) exit(-1);
que->stack1_len = 0;
que->stack2_len = 0;
que->stack1 = (int*)malloc(sizeof(int)*STACK_SIZE);
que->stack2 = (int*)malloc(sizeof(int)*STACK_SIZE);
return que;
}
/*要么进易出难,反之*/
//选择进易出难
void cQueueAppendTail(CQueue* obj, int value) {
if(obj->stack1_len >= STACK_SIZE-1)
{
printf("栈满");
exit(-1);
}
/*入栈就如栈1*/
obj->stack1[obj->stack1_len++] = value;
}
int cQueueDeleteHead(CQueue* obj) {
/*利用栈二出栈*/
//栈二有数据,直接出栈即可
if(obj->stack2_len > 0)
{
return obj->stack2[--obj->stack2_len];
}
else if(obj->stack1_len > 0)//栈二无数据,将栈1数据转移
{
//转移数据
while(obj->stack1_len > 0)
{
obj->stack2[obj->stack2_len++] = obj->stack1[--obj->stack1_len];
}
//转移完毕,出栈2
return obj->stack2[--obj->stack2_len];
}
else//两栈皆空
{
return -1;
}
}
void cQueueFree(CQueue* obj) {
free(obj->stack1);
free(obj->stack2);
free(obj);
}
/**
* Your CQueue struct will be instantiated and called as such:
* CQueue* obj = cQueueCreate();
* cQueueAppendTail(obj, value);
* int param_2 = cQueueDeleteHead(obj);
* cQueueFree(obj);
*/