【劍指offer】兩個棧實現一個佇列
轉載請註明出處:http://blog.csdn.net/ns_code/article/details/25068625
劍指offer上的第七題,之前在Cracking the Coding interview上做過該題,這次把原來的程式搬了過來,並根據九度OJ的測試系統寫了測試程式碼,在九度OJ上AC。- 題目描述:
用兩個棧來實現一個佇列,完成佇列的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
#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
****************************************************************/
相關文章
- 【劍指offer】兩個佇列實現一個棧佇列
- 劍指offer | 09. 用兩個棧實現佇列佇列
- 劍指offer-用兩個棧實現佇列-php佇列PHP
- 《劍指 Offer》棧實現佇列佇列
- 劍指offer(java實現)第5題“用兩個棧實現佇列”-牛客網Java佇列
- offer通過--7兩個棧實現佇列-2佇列
- offer通過--8兩個棧實現佇列-2佇列
- 兩個棧實現佇列佇列
- 兩個棧實現佇列操作佇列
- 用兩個棧實現佇列佇列
- leetcode155. 最小棧 1441. 用棧操作構建陣列 劍指 Offer 09. 用兩個棧實現佇列LeetCode陣列佇列
- 面試題之【用兩個棧實現佇列】面試題佇列
- 題目9:用兩個棧實現佇列佇列
- 《劍指offer》:[41]陣列中和為S的兩個數陣列
- [每日一題] 第七題:用兩個棧實現佇列每日一題佇列
- 【ZJOF】用來個棧來實現一個佇列佇列
- 用2個棧實現佇列佇列
- 劍指 Offer 25. 合併兩個排序的連結串列 JavaScript實現排序JavaScript
- 資料結構 使用2個棧實現一個佇列資料結構佇列
- 劍指offer——兩個連結串列的第一個公共結點C++C++
- 【劍指offer】第一個只出現一次的字元字元
- 劍指 Offer 59 - II. 佇列的最大值佇列
- 怎樣用一個佇列和一個棧實現求一個表示式的值?佇列
- 【劍指offer】刪除在另一個字串中出現的字元字串字元
- 通過佇列實現棧OR通過棧實現佇列佇列
- 劍指offer解析-下(Java實現)Java
- 劍指offer解析-上(Java實現)Java
- 演算法學習記錄五(C++)--->兩個棧實現佇列演算法C++佇列
- [CareerCup] 3.5 Implement Queue using Two Stacks 使用兩個棧來實現佇列佇列
- 劍指Offer-把陣列中的數排成一個最小的數陣列
- 劍指offer面試17 合併兩個排序的連結串列面試排序
- 劍指 offer(1) -- 陣列篇陣列
- 劍指offer——包含min函式的棧函式
- 【劍指offer】包含min函式的棧函式
- 9. 題目:對佇列實現棧&用棧實現佇列佇列
- 用佇列實現棧佇列
- 用棧實現佇列佇列
- [劍指Offer]面試題35:第一個只出現一次的字元面試題字元