国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

棧與隊(duì)列(二)之逆波蘭(RPN)計(jì)算器

2019-11-11 05:40:38
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

逆波蘭計(jì)算器(逆波蘭也是一種不需括號(hào)的后綴表達(dá)式)(這個(gè)計(jì)算器的寫法時(shí)間復(fù)雜度更加小,更有效率)

(棧的思想)逆波蘭(后綴表達(dá)式)(1-2)×(4+5)==1 2 - 4 5 + *

一、要求——實(shí)現(xiàn)對(duì)逆波蘭輸入表達(dá)式進(jìn)行計(jì)算(輸入正確)——支持帶小數(shù)點(diǎn)的數(shù)據(jù)

二、正常表達(dá)式--》逆波蘭表達(dá)式(這個(gè)理解需要自己總結(jié)理解,或者網(wǎng)上也有很多)

a+b--》a b +a+(b-c)--》a b c - +(有括號(hào)的先操作)a+(b-c)*d--》a b c - d * +(先乘除后加減,但有括號(hào)優(yōu)先級(jí)問題所以先減(想想棧的思想就是分別放入兩個(gè)數(shù)據(jù)到棧然后放入運(yùn)算符時(shí)數(shù)據(jù)出棧計(jì)算,計(jì)算結(jié)果入棧))a+d*(b-c)--》a d b c - * +

三、圖片解析(1-2)*(4+5)==1 2 - 4 5 + *

四、實(shí)例RPN計(jì)算器代碼(棧思想)

/*************************************************************************    > File Name: RPN計(jì)算器.c    > Author: geeker    > Mail: 932834897@QQ.com    > Created Time: 2017年02月06日 星期一 20時(shí)16分15秒 ************************************************************************/#include<stdio.h>#include<stdlib.h>#include<math.h>#include<ctype.h>//提供函數(shù)isdigit判斷char參數(shù)是否為數(shù)字#define stacksize 20#define maxbuffer 10//最大緩沖區(qū)typedef double ElemType;typedef struct{    ElemType *base;    ElemType *top;    int maxsize;}sqStack;void InitStack(sqStack *s)//初始化{    s->base=(ElemType *)malloc(stacksize * sizeof(ElemType));    if(!s->base)        exit(0);    s->top=s->base;    s->maxsize=stacksize;}void Push(sqStack *s,ElemType e)//壓棧{    if(s->top-s->base>=s->maxsize)        return;    *(s->top)=e;    s->top++;}void Pop(sqStack *s,ElemType *e)//出棧{    if(s->top==s->base)        return;    *e=*--(s->top);}int StackLen(sqStack s)//(看清s不是指針),計(jì)算當(dāng)前容量{    return(s.top-s.base);//點(diǎn)是結(jié)構(gòu)不是指針}int main(){    sqStack s;    char c;    double d,e;    char str[maxbuffer];//緩沖區(qū),作用比如scanf輸入1234,計(jì)算機(jī)并不會(huì)覺得是1234,而會(huì)是字符1,字符2.    int i=0;    InitStack(&s);    PRintf("請(qǐng)按逆波蘭表示示輸入計(jì)算數(shù)據(jù),數(shù)據(jù)用空格隔開,以#作為結(jié)束標(biāo)志/n");    scanf("%c",&c);//怎么把c轉(zhuǎn)化成double數(shù)據(jù)       while(c!='#'){        while(isdigit(c)||c=='.'){//這個(gè)函數(shù)判斷char參數(shù)是否為數(shù)字(其實(shí)判斷ASCII是否在48-57之間),頭文件#include "ctype.h"            str[i++]=c;            str[i]='/0';//因?yàn)閿?shù)組沒有初始化,所以下一個(gè)數(shù)據(jù)給他初始化為0,此0為字符0,與數(shù)字0區(qū)別在于內(nèi)存空間等            if(i>=10){                printf("出錯(cuò),輸入單個(gè)數(shù)據(jù)過(guò)大!/n");                return -1;            }//緩沖區(qū)有最大范圍        scanf("%c",&c);        if(c==' '){//比如輸入12 3,接受空格表示12輸入結(jié)束了           d=atof(str);//這個(gè)函數(shù)功能:將字符串轉(zhuǎn)化為double型,需要頭文件#include "stdlib.h",傳入?yún)?shù)是字符串,返回double型數(shù)據(jù)           Push(&s,d);           i=0;//i初始化           break;        }        }        switch(c){//遇到數(shù)字就進(jìn)棧,遇到加減乘除就出棧計(jì)算            case'+': Pop(&s,&e); Pop(&s,&d); Push(&s,d+e);break;//將兩個(gè)數(shù)字拿出來(lái),再運(yùn)算,再把結(jié)果放進(jìn)去            case'-': Pop(&s,&e); Pop(&s,&d); Push(&s,d-e);break;//d-e原因:比如1-2,1先進(jìn)棧,所以2先出棧,所以后出棧-先出棧            case'*': Pop(&s,&e); Pop(&s,&d); Push(&s,d*e);break;            case'/': Pop(&s,&e); Pop(&s,&d);                     if(e!=0){                         Push(&s,d/e);break;//d/e與減同樣的道理,最重要是除法要判斷,除數(shù)不能為0                   }                     else{                         printf("/n出錯(cuò):除數(shù)為零!");                         return -1;                     }                     break;        }        scanf("%c",&c);    }    Pop(&s,&d);//把最終結(jié)果放在任何里面都行不一定d,自己重新定義一個(gè)也可以    printf("/n最終的計(jì)算結(jié)果為: %lf",d);    return 0;}//5-(6+7)*8+9/4//5-13*8+9/4//5-104+2.25//-99+2.25//-96.75//5 6 7 + 8 * - 9 4 / +//結(jié)果 -96.750000五、注意

因?yàn)橐陨蠈?shí)例代碼我實(shí)在linux下編寫,格式為UTF-8,如果將我的代碼復(fù)制粘貼去的話遇見中文亂碼的話可以將格式改為ANSI即可,若沒問題那也沒啥事


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 绥中县| 平利县| 辽宁省| 津市市| 分宜县| 铜山县| 怀仁县| 荆门市| 青川县| 永年县| 安义县| 武穴市| 邯郸县| 基隆市| 依安县| 遵化市| 汕尾市| 阿鲁科尔沁旗| 临武县| 正阳县| 鞍山市| 莱阳市| 城市| 西华县| 长武县| 临泉县| 从化市| 托克逊县| 乳山市| 田林县| 宕昌县| 怀仁县| 金湖县| 原平市| 黄骅市| 新乡县| 察隅县| 承德市| 和田县| 太原市| 平湖市|