【劍指offer】包含min函式的棧

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

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


    劍指offer上的第21題,之前在Cracking the Coding interview上做過,思路參考這裡,這次寫了測試函式,在九度OJ上測試通過。


題目描述:

定義棧的資料結構,請在該型別中實現一個能夠得到棧最小元素的min函式。

輸入:

輸入可能包含多個測試樣例,輸入以EOF結束。
對於每個測試案例,輸入的第一行為一個整數n(1<=n<=1000000), n代表將要輸入的操作的步驟數。
接下來有n行,每行開始有一個字母Ci。
Ci=’s’時,接下有一個數字k,代表將k壓入棧。
Ci=’o’時,彈出棧頂元素。

輸出:

對應每個測試案例中的每個操作,
若棧不為空,輸出相應的棧中最小元素。否則,輸出NULL。

樣例輸入:
7
s 3
s 4
s 2
s 1
o
o
s 0
樣例輸出:
3
3
2
1
2
3
0

    AC程式碼:

/*
本程式採用陣列模擬棧
*/
typedef int ElemType;
#define MAX 100000  //棧的深度
#include<stdio.h>
#include<stdbool.h>

int top = -1;
/*
在棧頂索引指標為top時,向棧A中壓入資料data
*/
bool push(int *A,ElemType data)
{
	if(top>=MAX-1 || top<-1)
		return false;

	A[++top] = data;
	return true;
}

/*
在棧頂索引指標為top時,出棧
*/
bool pop()
{
	if(top<0)
		return false;

	top--;
	return true;
}

/*
棧頂當前索引指標為top,Min陣列最大深度也為MAX,
且Min的有效元素數與棧A中的元素個數相同,
它的對應位置用來儲存棧A對應位置到棧底這一部分元素中的最小值
*/
void minAll(int *A,int *Min)
{
	if(top>MAX-1)
		return ;
	Min[0] = A[0];
	int i;
	for(i=1;i<=top;i++)
	{
		if(Min[i-1] > A[i])
			Min[i] = A[i];
		else
			Min[i] = Min[i-1];
	}
}

/*
返回棧頂為top時棧中元素的最小值
*/
int min(int *Min)
{
	return Min[top];
}

int main()
{

	int n;
	int A[MAX];
	int Min[MAX];

	while(scanf("%d",&n) != EOF)
	{
		int i;
		for(i=0;i<n;i++)
		{
			char ci;
			while(getchar() != '\n')
				continue;
			scanf("%c",&ci);
			if(ci == 's')
			{
				ElemType k;
				scanf("%d",&k);
				push(A,k);
			}
			if(ci == 'o')
			{
				pop();
			}
			
			minAll(A,Min);
			if(top<0)
				printf("NULL\n");
			else
				printf("%d\n",min(Min));
		}
	}
	return 0;
}

/**************************************************************
    Problem: 1522
    User: mmc_maodun
    Language: C
    Result: Accepted
    Time:60 ms
    Memory:1624 kb
****************************************************************/


相關文章