1. 程式人生 > >C語言用棧頂和棧底指標實現棧的操作及用棧實現數值轉換

C語言用棧頂和棧底指標實現棧的操作及用棧實現數值轉換

棧是一種先進先出(FIFO)的資料結構。。廢話不多說,直接貼程式碼

程式碼參考了小甲魚的資料機構課程

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <windows.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10   //一次增加10的空間
#define ERROR 0
#define OK 1

typedef int Status;
typedef int Elemtype;
typedef struct Stack {
	Elemtype *top;
	Elemtype *base;
	int StackSize;
}*Sqstack;

//構建一個棧//
void InitStack(Sqstack s) {
	s->base = (Elemtype *)malloc(STACK_INIT_SIZE * sizeof(Elemtype));
	if (!s->base)
		exit(ERROR);
	s->top = s->base;
	s->StackSize = STACK_INIT_SIZE;
}

//入棧操作//
Status Push(Sqstack s, Elemtype e) {
	//將e的內容入棧
	//如棧滿則追加空間
	if (s->top - s->base >= s->StackSize) {
		//兩個地址相減實際上結果是地址差除以每個元素的地址值,也就是元素個數
		//這裡實際上等於才是邊界條件,因為我們的棧top指向空白的空間
		s->base = (Elemtype *)realloc(s->base, (s->StackSize + STACKINCREMENT) * sizeof(Sqstack));
		if (!s->base)
			exit(ERROR);
		s->top = s->base + s->StackSize;
		s->StackSize = s->StackSize + STACKINCREMENT;
	}
	*(s->top) = e;//將e放入記憶體空間
	s->top++;     //top繼續加一,指向沒使用的空間
	return OK;
}

//出棧操作//
Status Pop(Sqstack s, Elemtype *e) {
	//出棧之後將元素返回給e
	//判斷棧是否為空棧
	if (s->top == s->base)
		//此時棧是空棧
		return ERROR;
	s->top--; //top先減一,指向有元素的記憶體單元
	*e = *(s->top);
	return OK;
}

//清空棧//
Status ClearStack(Sqstack s) {
	//實際上就是把頭指標賦值給尾指標
	s->top = s->base;
	return OK;
}

//銷燬一個棧//
Status DestoryStack(Sqstack 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;
	return OK;
}

//棧內元素個數//
int Stacklen(Sqstack s) {
	return (s->top - s->base);
}

以上就是簡單的棧的抽象資料型別,下面貼主函式來實現數值的轉換

int main()
{
	Sqstack s = (Stack *)malloc(1 * sizeof(Sqstack));
	InitStack(s);
	int a[8] = { 1,1,0,0,1,0,0,1 };
	int b,c=0;//b用來存放結果,c用來存放十進位制結果
	for (int i = 0; i < 8; i++) 
		//8次入棧操作
		Push(s, a[i]);
	for (int i = 0; i < 8; i++) {
		//8次出棧操作
		Pop(s, &b);//b就是出棧的數
		//二進位制從最低位開始出來
		c += b * pow(2, i); 
	}
	printf("轉換成十進位制數:%d", c);
    return 0;
}

最後的執行結果:


PS:pow()函式有兩個引數,第一個引數是底數,第二個引數是指數。。。返回的值應該是double型的,vs有給我double轉換成int丟失精度的提醒。