1. 程式人生 > >資料結構——棧的基本操作(二進位制轉十進位制例項—c語言程式碼)

資料結構——棧的基本操作(二進位制轉十進位制例項—c語言程式碼)

棧是一種重要的線性結構。棧必須通過線性表或者連結串列來實現,順序表點選開啟連結連結串列點選開啟連結既可以向之前介紹的那樣獨立存在,同時它們也是一些特殊的資料結構(棧,佇列)的實現基礎。

定義:棧是一個先進後出的線性表,只要求在表尾進行插入和刪除等操作,這是棧相對於連結串列和順序表的獨特之處(對操作上有了一定的限制)。

這個末尾稱為棧頂(top)  相應的表頭稱為棧底(bottom)


線性表的兩種儲存方式:順序表和連結串列   一般棧用順序表儲存形式實現。

/********************************************
 *利用棧的資料結構,將二進位制轉換為十進位制數
 *分析:從最低位開始,第i位*2的(i-1次),再累加
 *利用棧來實現:將一串二進位制碼從高到低順序入棧
 *逐一從棧頂取出,每位乘積再累加 
 ********************************************/ 
#include<stdio.h>
#include<conio.h>
#define STACK_INIT_SIZE 20
#define STACK_MENT 10
#include<bits/stdc++.h>



/* 定義一個順序棧sqStack */ 
typedef struct {
	int *base;            //指向棧底的指標
	int *top;             //指向棧頂的指標
	int stacksize;        //當前最大容量
}sqStack;		

/* 建立一個棧 1.開闢空間 2.棧頂和底的地址賦給指標變數
void initStack(sqStack *s)
{
	//記憶體中開闢一段連續的空間作為棧空間,首地址賦給 s->base 
	s->base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));
	if(!s->base)	exit(0);				//分配失敗
	s->top = s->base;					//開始,棧頂就是棧底
	s->stacksize = STACK_INIT_SIZE;			        //最大容量為STACK_INIT_SIZE 
}

/******************** 
 *入棧(壓棧) 
 *每插入一個元素
 *top指標+1,直到棧滿
 *********************/
void Push(sqStack *s, int e)
{
	//判斷棧滿,追加空間 
	if(s->top - s->base >= s->stacksize)
	{
		s->base = (int *)realloc(s->base, (s->stacksize + STACK_MENT)*sizeof(int));
		if(!s->base)	exit(0);				//分配失敗
		s->top = s->base + s->stacksize;						
		s->stacksize = s->stacksize + STACK_MENT;	//設定棧的最大容量 
	}
	*(s->top) = e;								//放入資料 
		s->top++;
} 
 
/******************** 
 *出棧 
 *每彈出一個元素 指標下移
 *直到空棧
 *********************/
void Pop(sqStack *s, int *e)
{
	if(s->top == s->base)	return;
	*e = *--(s->top);
}
//計算棧的當前容量 棧的大小s.stacksize與當前容量不是一個概念
int Stacklen(sqStack s)
{
	return(s.top - s.base);
}
/******************** 
 *測試函式 
 *********************/
int main()
{
	int x;
	sqStack s;
	int len, i, sum=0;
	printf("請輸入01二進位制資料,#結束:\n");
	initStack(&s);
	scanf("%d", &x);
	while(x != '9')
	{
		Push(&s, x);
		scanf("%d", &x);
	}
	getchar();
	len = Stacklen(s);
	
	for(i =0; i<len; i++)
	{
		Pop(&s , &x);
		sum = sum +(x-48)*pow(2,i);
	}
	printf("結果為:");
	return 0;
}