设已知有两个堆栈s1和s2,请用这两个堆栈模拟出一个队列q。 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int isfull(stack s):判断堆栈s是否已满,返回1或0; int isempty (stack s ):判断堆栈s是否为空,返回1或0; void push(stack s, elementtype item ):将元素item压入堆栈s; elementtype pop(stack s ):删除并返回s的栈顶元素。 实现队列的操作,即入队void addq(elementtype item)和出队elementtype deleteq()。
时间: 2023-04-27 22:01:51 浏览: 142
通过2个栈 模拟队列。
使用两个堆栈s1和s2来模拟队列q的操作,具体实现如下:
1. 入队操作addq(elementtype item):将元素item压入堆栈s1中。
2. 出队操作deleteq():首先判断堆栈s2是否为空,如果不为空,则直接弹出s2的栈顶元素并返回;如果s2为空,则将s1中的所有元素依次弹出并压入s2中,然后再弹出s2的栈顶元素并返回。
具体实现代码如下:
typedef int elementtype;
typedef struct {
elementtype data[MAXSIZE];
int top;
} stack;
int isfull(stack s) {
return s.top == MAXSIZE - 1;
}
int isempty(stack s) {
return s.top == -1;
}
void push(stack s, elementtype item) {
if (isfull(s)) {
printf("Stack is full!\n");
return;
}
s.data[++s.top] = item;
}
elementtype pop(stack s) {
if (isempty(s)) {
printf("Stack is empty!\n");
return -1;
}
return s.data[s.top--];
}
stack s1, s2;
void addq(elementtype item) {
push(s1, item);
}
elementtype deleteq() {
if (!isempty(s2)) {
return pop(s2);
}
while (!isempty(s1)) {
push(s2, pop(s1));
}
if (!isempty(s2)) {
return pop(s2);
}
printf("Queue is empty!\n");
return -1;
}
阅读全文