两个栈实现队列
原创
©著作权归作者所有:来自51CTO博客作者小怡情ifelse的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
接着道题有多种思路,下面逐个介绍:
算法一:
思路:
s1时入栈的,s2时出栈的。
入队列,直接压到s1。
出队列,先把s1中的元素全部出栈压入大s2中,弹出s2中的栈顶元素;
再把s2的所有元素全部压回s1中。
算法二:
思路:
s1时入栈的,s2时出栈的,保证所有元素都在一个栈里面
入队列时,如果s1为空,把s2中所欲的元素倒出压到s1中,再把元素压入s1,否则直接压入s1.
出队列时,如果s2不为空,把s2中的栈顶元素直接弹出,
否则,把s1中的所有元素全部弹出压入s2中。
比较:与实现一相比,出队列时不必每次都捣鼓了。
算法三:
思路:
s1时入栈,s2时出栈
入队列:直接压入s1即可
出队列:如果s2不为空,把s2中的栈顶元素直接弹出,否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素
比较:与实现二相比较,入队直接入即可,感觉此时已是最优。
代码实现:
Python:
# 使用的是第三种解题思路, 此种是最优化解了,不用每次delete的时候都将栈A的元素加到栈B,然后再重新倒入A,而是一次性全部放入B,每次删的时候 看看B是否有元素,如果有直接pop
class Queue:
def __init__(self):
self.A, self.B = [], []
def appendTail(self, value: int) -> None:
self.A.append(value)
def deleteHead(self) -> int:
if self.B:
return self.B.pop()
if not self.A:
return -1
while self.A:
self.B.append(self.A.pop())
return self.B.pop()
q = Queue()
q.appendTail(1)
q.appendTail(2)
print(q.deleteHead())
print(q.deleteHead())
C代码:
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct stack {
int * top;//栈顶指针
int stackSize; //栈大小
int * base; //栈底指针
}Stack;
//初始化栈
Stack * initstack (Stack * s){
s = malloc(sizeof(Stack));
s->top = malloc(sizeof(int));
s->base = s->top;
s->stackSize = STACK_INIT_SIZE;
return s;
}
//入栈作
void push (Stack * s,int k) {
if (s->top - s->base >= s->stackSize) {
s->base = realloc(s->base, (s->stackSize +STACKINCREMENT) * sizeof(int));
if (!s->base) {
exit(0);
}
s->top = s->base + s->stackSize;
s->stackSize = s->stackSize + STACKINCREMENT;
}
*(s->top) = k;
s->top++;
}
//出栈
int pop (Stack *s) {
return *(--s->top);
}
//判断栈是否为空
int isStackEmpty (Stack * s) {
if (s->top == s->base) {
return 1;
}
return 0;
}
//判断栈是否满
int isStackFull (Stack *s ){
if (s->top == s->base) {
return 0;
}
return 1;
}
//队尾插入元素
void appendTail (Stack * s1,Stack * s2, int k) {
push(s1, k);
}
//队头删除结点
int deleteHead (Stack * s1 , Stack * s2) {
if (isStackEmpty(s2) == 1) {
while (isStackEmpty(s1) == 0) {
push(s2, pop(s1));
}
}
if (isStackEmpty(s2) == 1) {
printf("Empty!\n");
}
return pop(s2);
}
int main(int argc, const char * argv[]) {
// insert code here...
Stack * p1 = NULL;
Stack * p2 = NULL;
Stack * s1 = initstack(p1);;
Stack * s2 = initstack(p2);;
appendTail(s1, s2, 10);
appendTail(s1, s2, 20);
appendTail(s1, s2, 30);
int popValue = deleteHead(s1, s2);
printf("%d\n",popValue);
printf("Hello, World!\n");
return 0;
}