题目:编写一个类,用两个栈实现队列,支持队列的基本操作。
思想:
1.如果stackpop为空时,才能将stackpush中的数据压入stackpop中;
2.如果要将stackpush中的数据压入stackpop中,那么必须一次性将stackpush所有数据压入stackpop。
#include <stdio.h>
#include <stdlib.h>
typedef struct Stack
{
int data[10];
int top;
}stack,*pstack;
typedef struct Queuen
{
stack stackpush;
stack stackpop;
}queue,*pqueue;
//初始化队列
void InitQueue(pqueue pQueue)
{
(pQueue->stackpush).top = -1;
(pQueue->stackpop).top = -1;
}
//入队操作
void add(pqueue pQueue, int val)
{
(pQueue->stackpush).top += 1;
(pQueue->stackpush).data[(pQueue->stackpush).top] = val;
return;
}
void poll(pqueue pQueue)
{
int temp;
//如果stackpop 不是空,则不能向stackpop中压入数据
if( -1 == (pQueue->stackpop).top)
//将stackpush中的所有数据压入stackpop中
while((pQueue->stackpush).top != -1)
{
temp = (pQueue->stackpush).data[(pQueue->stackpush).top];
((pQueue->stackpush).top) --;
((pQueue->stackpop).top) ++;
(pQueue->stackpop).data[(pQueue->stackpop).top] = temp;
}
printf("%d\n",(pQueue->stackpop).data[(pQueue->stackpop).top]);
((pQueue->stackpop).top) --;
return;
}
void peek(pqueue pQueue)
{
int temp;
//stackpop为空时 ,需要将stackpush的数据全部压入
if(-1 == (pQueue->stackpop).top)
{
while((pQueue->stackpush).top != -1)
{
temp = (pQueue->stackpush).data[(pQueue->stackpush).top];
((pQueue->stackpush).top) --;
((pQueue->stackpop).top) ++;
(pQueue->stackpop).data[(pQueue->stackpop).top] = temp;
}
}
printf("%d\n",(pQueue->stackpop).data[(pQueue->stackpop).top]);
return;
}
int main()
{
queue Queue;
InitQueue(&Queue);
add(&Queue,7);
add(&Queue,6);
add(&Queue,5);
poll(&Queue);
peek(&Queue);
printf("----------------------------\n");
poll(&Queue);
peek(&Queue);
printf("----------------------------\n");
poll(&Queue);
printf("----------------------------\n");
add(&Queue,4);
add(&Queue,7);
peek(&Queue);
printf("----------------------------\n");
add(&Queue,6);
add(&Queue,5);
peek(&Queue);
poll(&Queue);
return 0;
}
编程中容易犯的错误为:
Queue刚开始定义了两个指向stack的指针,但是在编译运行时发生错误。后来发现是在InitQueue函数中指针没有初始化。
后来将Queue改为含有stackpush stackpop的元素后,程序能正常运行。