【剑指offer】面试题09. 用两个栈实现队列
程序员文章站
2022-06-17 17:47:52
...
题目描述:
解题思路:
栈的特点是先入先后出,要实现先入先出就得用两个栈来实现,一个栈用来入数据,一个栈用来出数据。结构如下:
typedef struct CQueue{
StackNode* IN_data;//用于入数据的栈
StackNode* out_data;//用于出数据的栈
} CQueue;
队列是由两个栈组成的,入队列时直接将数据压入(In_data)栈中。出数据时。若(out_data)栈为空,就将(In_data)的数据逐个的压入(out_data)栈中,然后pop(out_data)栈的栈顶元素(将数据从一个栈导入到另一个栈顺序就反了,然后pop栈顶元素就达到了先入先出的效果)。
详细代码如下:
/*------------------------------------栈的基本操作-----------------------------------*/
typedef int STDataType;
typedef struct StackNode
{
STDataType value;
struct StackNode *next;
}StackNode;
//函数声明
StackNode* StackCreat();
void StackPush(StackNode**,STDataType);
STDataType StackPop(StackNode**);
bool is_StackEmpty(StackNode* stack);
STDataType StackTop(StackNode*);
StackNode* StackCreat(){//栈初始化
StackNode* ptr = NULL;
return ptr;
}
void StackPush(StackNode** Ptr,STDataType value){//入栈
StackNode* st = (StackNode*)malloc(sizeof(StackNode));
st ->value = value;
st ->next = *Ptr;
*Ptr = st;
}
STDataType StackPop(StackNode** ptr){//出栈
STDataType value;
if(is_StackEmpty(*ptr)){
printf("栈空\n");
}else{
StackNode* st = *ptr;
value = (*ptr) ->value;
*ptr = (*ptr) ->next;
free(st);
}
return value;
}
STDataType StackTop(StackNode* ptr){//访问栈顶元素
return ptr ->value;
}
bool is_StackEmpty(StackNode* stack){//是否栈空
if( stack == NULL ){
return true;
}else{
return false;
}
}
void StackDestroy(StackNode** ptr){//销毁栈
if(*ptr){
while( (*ptr) ){
StackPop(ptr);
}
}else{
printf("栈为空");
}
}
/*------------------------------------------------------------------------*/
typedef struct CQueue{
StackNode* IN_data;//用于入数据的栈
StackNode* out_data;//用于出数据的栈
} CQueue;
CQueue* cQueueCreate() {
CQueue* Pqueue = (CQueue*)malloc(sizeof(CQueue));
Pqueue ->IN_data = StackCreat();
Pqueue ->out_data = StackCreat();
return Pqueue;
}
void cQueueAppendTail(CQueue* obj, int value) {//尾插
StackPush(&(obj ->IN_data),value);
}
int cQueueDeleteHead(CQueue* obj) {
int value;
if(is_StackEmpty(obj ->IN_data) && is_StackEmpty(obj ->out_data)){//两个栈都为空
return -1;
}else if(is_StackEmpty(obj ->out_data)){
while(obj ->IN_data){
value = StackPop(&(obj ->IN_data));
StackPush(&(obj ->out_data),value);
}
}
value = StackPop(&(obj ->out_data));
return value;
}
void cQueueFree(CQueue* obj) {
if(!is_StackEmpty(obj ->IN_data)){//入数据的栈不为空
while(obj ->IN_data){
StackPop(&(obj ->IN_data));
}
}else if(!is_StackEmpty(obj ->out_data)){//出数据的栈不为空
while(obj ->out_data){
StackPop(&(obj ->out_data));
}
}
}
上一篇: Extjs学习笔记之六 面版