思路
不是非常熟练,这里就用一种简单的,用两个队列来辅助实现栈
对于队列:
1 2 3
| 1. 用head==rear==-1,来判断队列是否为空 2. 入队列的时候,如果为空先把head置为0,用循环队列表示,rear=(rear+1)%size; 3. 出队列的时候是吧head出出来, head=(head+1)%size;
|
对于双队列表示栈:
1
| 1. 用两个队列来表示栈,栈是后进先出,而队列是先进先出,想来就是出队列的最后一个就是栈出的第一个,实现的思路就是两个队列,要入栈的时候放在不空的那个队列里,要出栈的时候把有内容的队列出队列到另一个队列直到只剩一个,弹出这个就是栈的机制了
|
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| #define LEN 20 typedef struct queue{ int *data; int head; int rear; int size; }Queue;
typedef struct { Queue *queue1,*queue2; } MyStack;
Queue* initQueue(int k){ Queue* obj=(Queue*)malloc(sizeof(Queue)); obj->data=(int *)malloc(k*sizeof(int)); obj->head=-1; obj->rear=-1; obj->size=k; return obj; }
void enQueue(Queue* obj,int e){ if(obj->head==-1){ obj->head=0; } obj->rear=(obj->rear+1)%obj->size; obj->data[obj->rear]=e; }
int deQueue(Queue* obj){ int a=obj->data[obj->head]; if(obj->head==obj->rear){ obj->head=-1; obj->rear=-1; return a; } obj->head=(obj->head+1)%obj->size; return a; }
int isEmpty(Queue * obj){ return obj->head==-1; }
MyStack* myStackCreate() { MyStack*obj=(MyStack*)malloc(sizeof(MyStack)); obj->queue1=initQueue(LEN); obj->queue2=initQueue(LEN); return obj; }
void myStackPush(MyStack* obj, int x) { if(isEmpty(obj->queue1)){ enQueue(obj->queue2,x); }else{ enQueue(obj->queue1,x); } }
int myStackPop(MyStack* obj) { if(isEmpty(obj->queue1)){ while(obj->queue2->head!=obj->queue2->rear){ enQueue(obj->queue1,deQueue(obj->queue2)); } return deQueue(obj->queue2); } while(obj->queue1->head!=obj->queue1->rear){ enQueue(obj->queue2,deQueue(obj->queue1)); } return deQueue(obj->queue1); }
int myStackTop(MyStack* obj) { if (isEmpty(obj->queue1) && isEmpty(obj->queue2)) { return -1; } if(isEmpty(obj->queue1)){ return obj->queue2->data[obj->queue2->rear]; } return obj->queue1->data[obj->queue1->rear]; }
bool myStackEmpty(MyStack* obj) { if (isEmpty(obj->queue1) && isEmpty(obj->queue2)) { return true; } else{ return false; } }
void myStackFree(MyStack* obj) { free(obj->queue1->data); obj->queue1->data=NULL; free(obj->queue1); obj->queue1=NULL; free(obj->queue2->data); obj->queue2->data=NULL; free(obj->queue2); obj->queue2=NULL; free(obj); obj=NULL;
}
|