找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4509|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

棧的操作--將二進(jìn)制數(shù)轉(zhuǎn)化為十進(jìn)制數(shù)輸出-C語(yǔ)言教程

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:99624 發(fā)表于 2015-12-20 02:48 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
//  這是一個(gè)“!辈僮鞯睦釉创a:

#include"stdio.h"#include"stdlib.h"//exit(0),malloc()
#include"math.h"//pow(int a ,int b);a的b次方
/*
將PC鍵盤輸入的二進(jìn)制數(shù)轉(zhuǎn)化為十進(jìn)制數(shù)輸出,以“#”作為結(jié)束符;
將鍵盤輸入的0或1視為字符,ACSII碼字符0對(duì)應(yīng)的十六進(jìn)制數(shù)是0x48
*/
#define STACK_INIT_SIZE 20
#define STACKINCRESIZE  10
typedef char ElemType;//創(chuàng)建一個(gè)類型,下面凡事ElemType都代表char類型
//聲明一個(gè)棧類型數(shù)據(jù)結(jié)構(gòu),元素是棧的3個(gè)基本要素
struct qstack
{
   ElemType  *top; //棧頂指針,字節(jié)指針
   ElemType  *base; //棧底指針
   int stacksize; // 棧的容量
};

//通過(guò)這個(gè)函數(shù)將棧的三要素進(jìn)行初始化
void Stack_Iinit(qstack *s)
{
   s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
   if(!s->base)//如果內(nèi)存分配失敗
   {
     printf("內(nèi)存分配失。");
exit(0);//
   
   }
   s->top=s->base; //
   s->stacksize = STACK_INIT_SIZE;//

}

void push(qstack *s,ElemType e)//注意傳入的類型
{
  if(s->top-s->base >= s->stacksize )//說(shuō)明棧已經(jīng)滿了
  {
     s->base=(ElemType *)realloc(s->base,(STACK_INIT_SIZE+STACKINCRESIZE)*sizeof(ElemType));
//重新分配空間,注意空間加大了

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

}

void pop(qstack *s,ElemType *e)//將出棧數(shù)據(jù)放在e中,所以形參用指針為宜
{
if(s->top==s->base)//
{
    return;

}
*e=*--(s->top);//注意!括號(hào)不要搞錯(cuò)!否則結(jié)果出錯(cuò)!
}
//
int StackLen(qstack *s)
{
return (s->top-s->base);//棧的長(zhǎng)度
}
//注意:用鍵盤輸入“0”和“1”字符時(shí),以“#”結(jié)束。比如輸入:“1110#”按回車鍵就可以得出答案
void main()
{
    qstack s;
ElemType c;
int i,len,sum=0;
    Stack_Iinit(&s);
printf("請(qǐng)輸入0或1字符,以#作為結(jié)束符\n");
scanf("%c",&c);//注意!本句表示一次輸入一個(gè)字符
  /*
  注意:比如輸入“1110010#”再按下回車鍵,字符串“1110010#”就以一次一個(gè)字符的順序輸入到PC鍵盤緩沖區(qū)即入棧;
  出棧時(shí)是以“后進(jìn)先出”的順序出棧,剛好最后入棧的字符就是二進(jìn)制的最低位。對(duì)于棧的操作一定要注意入棧出棧順序
*/
while(c!='#')
{
      push(&s,c);
  scanf("%c",&c);//這里為什么還要此句呢?因?yàn)閟canf()一次只能輸入一個(gè)字符,所以必須循環(huán)輸入


}
getchar();//改變鍵盤輸入緩存指針,即將回車鍵讀出來(lái),這樣可以避免“\r”字符(回車鍵)輸出
    len= StackLen(&s);
printf("當(dāng)前棧的容量是:%d\n",len);
for(i=0;i<len;i++)
{
   pop(&s, &c );
   sum = sum + (c-48)*pow(2,i);//48對(duì)應(yīng)ACSII碼字符“0”;(c-48)的值要么是0要么是1字符
}
printf("轉(zhuǎn)換的十進(jìn)制數(shù)是:%d\n",sum);

}

/////////////////////////////////////-----------------GKXW---------2015年11月14日 00:03:08--//////////////////////////////////////////



     棧(stack)是一種“后進(jìn)先出”的數(shù)據(jù)結(jié)構(gòu),屬于線性表的一種,只能在一頭操作。在現(xiàn)實(shí)生活中應(yīng)用很大,多學(xué)習(xí)一種數(shù)據(jù)結(jié)構(gòu)就意味著多一種能力。本來(lái)是要分析uc/os-ii操作系統(tǒng)的,但是由于在學(xué)習(xí)STeMwin的時(shí)候涉及到文件系統(tǒng)的操作,所以就專門學(xué)習(xí)了C語(yǔ)言文件部分內(nèi)容。計(jì)劃不得不推遲了。程序好不好關(guān)鍵就看數(shù)據(jù)結(jié)構(gòu)用得合不合理,編程實(shí)際上就是數(shù)據(jù)的怎樣存儲(chǔ),以什么數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)的問(wèn)題!稊(shù)據(jù)結(jié)構(gòu)與算法》是修煉內(nèi)功的,是對(duì)計(jì)算機(jī)語(yǔ)言學(xué)習(xí)的一種提高。

      




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:851371 發(fā)表于 2020-11-29 21:46 | 只看該作者
非常感謝  讓我對(duì)其中有些語(yǔ)句更加明白了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表