妙趣橫生的算法實例1-4

#include <stdio.h>
#include <malloc.h>
#include <math.h>

#define STACK_INIT_SIZE 10
#define STACK_INCREMENT_SIZE 10

typedef char ElemType;

typedef struct 
{
	ElemType *base;
	ElemType *top;
	int stackSize;
}stack;

void initStack(stack *s)
{
	s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
	if(!(s->base)) return;
	s->top = s->base;
	s->stackSize = STACK_INIT_SIZE;
}

void pushStack(stack *s, ElemType e)
{
	if((s->top - s->base) >= s->stackSize)
	{
		s->base = (ElemType *)realloc(s->base, (s->stackSize + STACK_INCREMENT_SIZE) * sizeof(ElemType));
		if(!(s->base)) return;
		s->top = s->base + s->stackSize;
		s->stackSize = s->stackSize + STACK_INCREMENT_SIZE;
	}

	*(s->top) = e;
	(s->top)++;
}

void popStack(stack *s, ElemType *e)
{
	if(s->base == s->top) return;
	*e = *(--(s->top));
}

int stackLen(stack s)
{
	return (s.top - s.base);
}

void destroyStack(stack *s)
{
	free(s->base);
	s->base = s->top = NULL;
	s->stackSize = 0;
}

//void destroyStack(stack *s)
//{
//	int i, len;
//	len = s->stackSize;
//	for(i = 0; i < len; i++)
//	{
//		free(s->base);
//		s->base++;
//	}
//
//	s->base = s->top = NULL;
//	s->stackSize = 0;
//}

int power(int n)
{
	int i;
	int product = 1;
	for(i = 1; i <= n; i++)
	{
		product = product * 2;
	}

	return product;
}

void main()
{
	stack binaryToDecimalStack;
	int i, len, decimal = 0;
	ElemType pushBinary, popBinary;

	initStack(&binaryToDecimalStack);
	printf("請輸入二進制數,以“;”結束:\n");
	scanf("%c", &pushBinary);
	while(pushBinary != ';')
	{
		pushStack(&binaryToDecimalStack, pushBinary);
		scanf("%c", &pushBinary);
	}
	
	len = stackLen(binaryToDecimalStack);

	for(i = 0; i < len; i++)
	{
		popStack(&binaryToDecimalStack, &popBinary);
		while(popBinary != '0' && popBinary != '1')
		{
			printf("不好意思,您輸入的不是二進制數據!:\n");
			return;
		}

		decimal = decimal + (popBinary - 48) * power(i);
	}

	for(i = 0; i < len; i++)
	{
		printf("%c", *(binaryToDecimalStack.base++));
	}

	printf("轉換成的二進制爲:%d\n", decimal);

	//destroyStack(&binaryToDecimalStack);
}

這個程序銷燬棧的時候,在windows會崩潰,我也不知道怎麼回事?有誰能告訴我嗎?回頭到linux下試試。

我剛開始把類型定義爲int型,但是沒有辦法判斷什麼時候結束,而且,如果輸入字符的話,就會出錯,看書上定義爲char型,感覺不錯,而且char型佔一個字節,而int要佔4個字節。

我知道哪裏錯了,

for(i = 0; i < len; i++)  
    {  
        printf("%c", *(binaryToDecimalStack.base++));  //這句base++,base已經指向其它地方了,原因是你Pop的時候stack size沒有--
    }  

把這裏改爲:

for(i = 0; i < len; i++)  
    {  
        printf("%c", binaryToDecimalStack.base[i]); 
    }  

就可以了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章