题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数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;
}