1. 程式人生 > >資料結構4-利用棧的結構,將二進位制數轉換為十進位制數

資料結構4-利用棧的結構,將二進位制數轉換為十進位制數

編寫一個程式,利用棧的結構,將二進位制數轉換為十進位制數,程式碼如下:

#include"stdio.h"
#include"math.h"
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10

typedef char ElemType;
typedef struct{
	ElemType *base;
	ElemType *top;
	int stacksize;
}sqStack;

initStack(sqStack *s)
{
	/*記憶體中開闢一段連續空間作為棧空間,首地址賦值給s->base*/
	s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
	if(!s->base) /*分配空間失敗*/
		exit(0);
	s->top = s->base; /*最開始,棧頂就是棧底*/
	s->stacksize = STACK_INIT_SIZE; /*最大容量為STACK_INIT_SIZE*/
}

Push(sqStack *s,ElemType e){
	if(s->top - s->base >= s->stacksize){
		/*棧滿,追加空間*/
	s->base = (ElemType *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType));
	if(!s->base) /*儲存分配失敗*/
		exit(0);
	s->top=s->base+s->stacksize;
	s->stacksize = s->stacksize + STACKINCREMENT; /*設定棧的最大容量*/
	}
	*(s->top)=e; /*放入資料*/
	s->top++;
}

Pop(sqStack *s,ElemType *e){
	if(s->top == s->base) return;
	*e = *--(s->top);
}

int StackLen(sqStack s){
	return (s.top-s.base);
}

main(){
	ElemType c;
	sqStack s;
	int len,i,sum = 0;
	printf("Please input a Binary digit\n");

	initStack(&s); /*建立一個棧,用來存放二進位制字串*/
	/*輸入0/1字元表示的二進位制數,以#結束*/
	scanf("%c",&c);
	while(c!='#')
	{
		Push(&s,c);
		scanf("%c",&c);
	}
	getchar();
	len = StackLen(s); /*得到棧中的元素個數,即二進位制數的長度*/

	for(i=0;i<len;i++){
		Pop(&s,&c);
		sum = sum + (c-48) *pow(2,i); /*轉換為十進位制*/
	}
	printf("Decimal is %d\n",sum);
	getche();
}

執行的結果如下圖:

例項與分析:

       1.出棧的時候有一個引數為什麼是ElemType *e,而不是ElemType e?而為什麼進棧的時候是ElemType e?不知道大家想過這個問題沒有?原因很簡單,是因為在函式當中傳遞的都是形參,而形參是不能被傳遞出去的,能傳遞出去的話只能傳遞地址,這就解釋了為什麼出棧的時候是ElemType *e,因為e這個值我們是要從函式傳遞出去的,而在入棧的時候我們僅僅是要使用而已。

注:我突然想起來在資料結構3那篇文章裡面有一個地方沒有說明白,就是函式insertList()的引數中有一個LinkList *list,為什麼是LinkList *list而不是LinkList list。由於LinkList *list是指向LinkList型別的指標變數,相當於指向LNode型別的指標的指標。這是因為在函式中要對list,也就是表頭指標進行修改,而呼叫該函式時,實參是&list,而不是list。因此必須採取指標引數傳遞的辦法,否則無法在被調函式中修改主函式中定義的變數的內容。

相關推薦

資料結構4-利用結構二進位制轉換十進位制

編寫一個程式,利用棧的結構,將二進位制數轉換為十進位制數,程式碼如下: #include"stdio.h" #include"math.h" #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 typedef char

設置用戶密碼時全角轉換半角

英文字母 har 分享 elf bsp log 密碼 解決 mage 情景: 註冊管理員賬號,用戶輸入的是全角密碼,登錄時輸入半角密碼,顯示密碼錯誤 解決方案: 將全角密碼改成半角密碼 var password = self.loginForm.password /

html 頁面/jsp 頁面 日期格式的轉換日期格式轉換字串型別

jsp 頁面 引入jstl標籤庫中fmt <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 使用標籤進行日期Date型別到String 字串的轉化 <fmt:formatDate valu

ionic2 geolocation定位geolocation座標轉換百度座標高德地圖座標

安裝 geolocation 外掛 執行以下命令 npm install --save @ionic-native/geolocation 將geolocation外掛在app.module.ts內宣告 import { Geolocation } from '@ionic-nativ

Python解密網易雲音樂.ncm檔案.ncm檔案轉換.mp3檔案實現隨處播放(另附C++已編譯轉換器)

網易雲音樂把.mp3音樂檔案加密為.ncm檔案,導致不能將下載好的音樂複製到其它裝置或使用非網易雲音樂播放器播放,該程式可將.ncm檔案逆向解密為.mp3檔案並保留最高音質。 另有C++已編譯.exe轉換器,將.ncm檔案拖到.exe上直接執行轉換,生成.mp3檔案在.ncm檔案相同路徑。點選下

阿里雲虛擬主機使用免費申請的SSL證書http請求轉換https

最近在開發微信小程式,部分資料需要從後臺獲取,但是我的阿里雲虛擬主機的域名是沒有SSL證書,是http請求,而微信小程式新增的伺服器域名要求是https的,沒辦法,只能想辦法將http請求轉換成https; 我採取的辦法是通過阿里雲申請免費的SSL證書,然後通過阿里雲CDN服務來完成間接跳轉配置

C# 獲取當前時間戳時間戳轉換當前本地時間

/// <summary> /// 獲取當前本地時間戳 /// </summary> /// <returns></returns> pub

實現atoi這個函式一個字串轉換整數。如果沒有合法的整數返回0。如果整數超出了32位整數的範圍返回INT_MAX(2147483647)如果是正整數

public class Solution {    /**     * @param str: A string     * @return: An integer     */    public int atoi(String str) {        // write your code here 

Java如何解析某個目錄下xml檔案XML檔案轉換報表資料來源?

在Java開發的報表工具FineReport中,假如在目錄下儲存了幾個XML檔案,希望把XML檔案轉換為報表資料來源,同時希望展示動態xml資料來源的效果,這時可通過引數的方式,動態獲取xml欄位中的值再作為報表資料來源。Northwind.xml記錄資料格式如下:<?

python基礎str型別轉換float型別

from functools import reduce def str2float(s):      L=s.split('.');     return reduce(lambda x,y:y+x

資料結構利用實現表示式求值

前言 java實現,利用int型別儲存運算元,完善了char類型範圍太小的問題,利用遞迴,完善了括號巢狀使用的問題。 執行結果截圖 程式碼實現: import java.util.Arrays; import java.util.Scanner; public

利用結構實現二叉樹的非遞迴遍歷求二叉樹深度、葉子節點、兩個結點的最近公共祖先及二叉樹結點的最大距離

原文地址:http://blog.csdn.net/forbes_zhong/article/details/51227747 利用棧實現二叉樹的非遞迴遍歷,並求二叉樹的深度、葉子節點數、兩個節點的最近公共祖先以及二叉樹結點的最大距離,部分參考《劍指offer》這本書

3.4.4 利用遞迴轉換成非遞迴的方法

在函式執行時系統需要設立一個“遞迴工作棧”儲存第一層遞迴所需的資訊,此工作棧是遞迴函式執行的輔助空間,所以可以看出,遞迴程式在執行時需要系統提供隱式棧這種資料結構來實現,對於一般的遞迴過程,仿照遞迴演算法執行過程中遞迴工作棧的狀態變化可直接寫出相應的非遞迴演算法。這種利用棧消除遞迴過程的步驟如下。

3.4.4 利用遞歸轉換成非遞歸的方法

編制 img 處理 利用 根據 lock 題意 com 容易 在函數執行時系統需要設立一個“遞歸工作棧”存儲第一層遞歸所需的信息,此工作棧是遞歸函數執行的輔助空間,所以可以看出,遞歸程序在執行時需要系統提供隱式棧這種數據結構來實現,對於一般的遞歸過程

資料結構用順序實現R進位制轉換

#include<stdio.h> #define MAXSIZE 500 typedef struct{ int *base; int *top; int stacksize; }Sqstack; int Initstack(Sqstack &S)

資料結構應用案例——結構用於8皇后問題的回溯求解

                     【說明】本文來自由周世平老師主編的《C語言程式設計》教材。我作為參編人員執筆了第7、8章。“第8章 問題求解與演算法”中“8.6.1 回溯法”以8皇后問題的求解為例,介紹了回溯法的解題過程。這個解決方案中用到了“棧”,引用至此,作為棧應用的例子。需要說明的是,教材面向

利用結構計算表示式串演算法

演算法思想: 將中綴表示式轉化為字尾表示式順序的掃描字尾表示式中的每一個字元,並作如下操作:如果該字元為運算元,則將其壓入棧中;如果該字元為操作符<operator>,則連續從棧中彈出兩個

利用結構生成字尾表示式

利用棧結構來構建字尾表示式 關於字尾表示式,推薦部落格http://blog.csdn.net/antineutrino/article/details/6763722/ 部落格中詳細介紹了表示式的生成過程。這裡作簡要介紹。 字尾表示式的生成準則: 利用該準則轉換A*(B

資料結構實驗之一:進位制轉換(java實現)

資料結構實驗之棧一:進位制轉換 Time Limit: 1000MS Memory Limit: 65536KB Problem Description 輸入一個十進位制整數,將其轉換成對應

Flume1.4 相關引數設定收集的資料彙總到hdfs解決許多小檔案問題

參照官方文件,將 flume client 收集的日誌檔案 彙總到  flume sink收集端,然後儲存到hdfs 中,預設會按生成許多小檔案,如圖所示 實際中可能只需要生成一個檔案即可,這就涉及到了幾個相關引數設定如下即可 需要修改的檔案位於 flume/con