【劍指offer】兩個棧實現一個佇列

蘭亭風雨發表於2014-05-05

轉載請註明出處:http://blog.csdn.net/ns_code/article/details/25068625

    劍指offer上的第七題,之前在Cracking the Coding interview上做過該題,這次把原來的程式搬了過來,並根據九度OJ的測試系統寫了測試程式碼,在九度OJ上AC。

時間限制:1 秒

記憶體限制:128 兆


題目描述:

用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。
佇列中的元素為int型別。

輸入:

每個輸入檔案包含一個測試樣例。
對於每個測試樣例,第一行輸入一個n(1<=n<=100000),代表佇列操作的個數。
接下來的n行,每行輸入一個佇列操作:
1. PUSH X 向佇列中push一個整數x(x>=0)
2. POP 從佇列中pop一個數。

輸出:

對應每個測試案例,列印所有pop操作中從佇列pop中的數字。如果執行pop操作時,佇列為空,則列印-1。

樣例輸入:
3
PUSH 10
POP
POP
樣例輸出:
10
-1
  AC程式碼如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>

typedef struct Node
{
	int data;
	struct Node *pNext;
}NODE,*PNODE;

typedef struct Stack
{
	PNODE pTop;
	PNODE pBottom;
}STACK,*PSTACK;

PSTACK create_stack();
void push_stack(PSTACK,int);
void traverse_stack(PSTACK);
bool pop_stack(PSTACK,int *);
bool is_empty(PSTACK);
void clear_stack(PSTACK);
void enter_Queue(PSTACK,int);
bool delete_Queue(PSTACK,PSTACK,int *);

int main()
{	
	int n;		//儲存操縱的個數
	int data;	//儲存輸入的要push的元素
	int pData;	//儲存pop出來的元素
	char *push = "PUSH";
	char *pop = "POP";
	char input[5];
	int data_pop;

	//建立兩個空棧
	PSTACK pS1 = create_stack();
	PSTACK pS2 = create_stack();
	scanf("%d",&n);
	while(n-->0)
	{
		scanf("%s",input);
		if(strcmp(input,push) == 0)
		{
			scanf("%d",&data);
			enter_Queue(pS1,data);
		}
		if(strcmp(input,pop) == 0)
		{
			if(delete_Queue(pS1,pS2,&pData))
				printf("%d\n",pData);
			else
				printf("-1\n");
		}
	}

	clear_stack(pS1);
	clear_stack(pS2);
	return 0;
}

/*
建立一個空棧,並返回指向該棧的指標
*/
PSTACK create_stack()
{
	PSTACK pS = (PSTACK)malloc(sizeof(STACK));
	pS->pTop = (PNODE)malloc(sizeof(NODE));
	if(NULL==pS || NULL==pS->pTop)
	{
	   printf("malloc failed");
	   exit(-1);
	}	
	else
	{
	   pS->pBottom = pS->pTop;
	   pS->pBottom->pNext = NULL;
	}
	
	return pS;
}

/*
判斷該棧是否為空
*/
bool is_empty(PSTACK pS)
{
	if(pS->pTop == pS->pBottom)
	   return true;
    else
	   return false;
}

/*
向pS指標指向的棧中壓入資料val
*/
void push_stack(PSTACK pS,int val)
{
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	if(NULL==pNew)
	{
	   printf("malloc failed");
	   exit(-1);
	}	
	else
	{
	   pNew->data = val;
	   pNew->pNext = pS->pTop;
	   pS->pTop = pNew;
	}	
	return ;
}

/*
從棧中推出資料,並將推出的資料儲存在pData指標所指向的位置
*/
bool pop_stack(PSTACK pS,int *pData)
{
	if(is_empty(pS))
	   return false;
	else
	{
	   PNODE p = pS->pTop;
	   *pData = p->data;
	   pS->pTop = p->pNext;
	   free(p);
	   p = NULL;
	   return true;
	}
}

/*
清空棧,即將其還原為空棧
*/
void clear_stack(PSTACK pS)
{
	if(is_empty(pS))
	   return ;
	else
	{
	   PNODE p = pS->pTop;
	   PNODE r = NULL;
	   while(p != pS->pBottom)
	   {
			r = p->pNext;
			free(p);
			p = r;
	   }
	   pS->pTop = pS->pBottom;
   	}
}

/*
用兩個棧模擬入隊
*/
void enter_Queue(PSTACK pS1,int val)
{
	push_stack(pS1,val);
}

/*
用兩個棧模擬出隊
*/
bool delete_Queue(PSTACK pS1,PSTACK pS2,int *pData)
{
	if(is_empty(pS1) && is_empty(pS2))
		return false;
	if(!is_empty(pS2))
		pop_stack(pS2,pData);
	else if(!is_empty(pS1))
	{
		while(!is_empty(pS1))
		{
			int pS1_popData;
			pop_stack(pS1,&pS1_popData);
			push_stack(pS2,pS1_popData);
		}
		pop_stack(pS2,pData);
	}
	return true;
}

/**************************************************************
    Problem: 1512
    User: mmc_maodun
    Language: C
    Result: Accepted
    Time:80 ms
    Memory:1836 kb
****************************************************************/


相關文章