最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++利用棧實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式

 更新時(shí)間:2020年04月26日 14:41:09   作者:Halosec_Wei  
這篇文章主要為大家詳細(xì)介紹了C++利用棧實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C++實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的具體代碼,供大家參考,具體內(nèi)容如下

題目:現(xiàn)有中綴表達(dá)式如:1+(2-3)*4+10/5

請(qǐng)用棧的特性編寫一個(gè)程序,使得程序輸出后綴表達(dá)式

分析如下:

STEP1:

1+(2-3)*4+10/5

首先遇到第一個(gè)輸入是數(shù)字1,數(shù)字在后綴表達(dá)式中都是直接輸出,接著是符號(hào)“+”,入棧:

STEP2:

1+(2-3)*4+10/5

第三個(gè)字符是“(”,依然是符號(hào),入棧,接著是數(shù)字2,輸出,然后是符號(hào)“-”,入棧:

STEP3:

1+(2-3)*4+10/5

接下來是數(shù)字3,輸出,緊跟著是“)”,此時(shí),我們需要去匹配棧里的“(”,然后再匹配前將棧頂數(shù)據(jù)依次出棧(這就好比括號(hào)里優(yōu)先執(zhí)行的道理):

STEP4:

1+(2-3)*4+10/5

緊接著是符號(hào)“*”,直接入棧

STEP5:

1+(2-3)*4+10/5

遇到數(shù)字4,輸出,之后是符號(hào)“+”,此時(shí)棧頂元素是符號(hào)“*”,按照先乘除后加減原理,此時(shí)棧頂?shù)某颂?hào)優(yōu)先級(jí)比即將入棧的加好要大,所以出棧。
棧中第二個(gè)元素是加號(hào),按理來說大家平起平坐,但是按照先來后到的原則,棧里的加號(hào)呆得太久了,也要出棧透透氣。(同理如果棧里還有其他操作符,也是出棧)

最后把剛剛的那個(gè)加號(hào)入棧,操作如下圖:

STEP6:

1+(2-3)*4+10/5

緊接著數(shù)字10,輸出,最后是符號(hào)“/”,進(jìn)棧:

STEP7:

1+(2-3)*4+10/5

最后一個(gè)數(shù)字5,輸出,所有的輸入處理完畢,但是棧中仍然有數(shù)據(jù),所以將棧中符號(hào)依次出棧。

總結(jié)規(guī)則:

從左到右遍歷中綴表達(dá)式的每個(gè)數(shù)字和符號(hào),若是數(shù)字則直接輸出,若是符號(hào),則判斷其與棧頂符號(hào)的優(yōu)先級(jí),是右括號(hào)或者優(yōu)先級(jí)低于棧頂符號(hào),則棧頂元素依次出棧并輸出,直到遇到左括號(hào)或棧空才將低優(yōu)先級(jí)的那個(gè)符號(hào)入棧

代碼實(shí)現(xiàn)如下:

#include <stdio.h>
#include <stdlib.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 = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
 if( !s->base )
  exit(0);
 
 s->top = s->base;
 s->stackSize = 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;  // 存放數(shù)據(jù)
 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);
}
 
int main()
{
 sqStack s;
 char c, e;
 
 InitStack( &s );
 
 printf("請(qǐng)輸入中綴表達(dá)式,以#作為結(jié)束標(biāo)志:");
 scanf("%c", &c);
 
 while( c != '#' )
 {
  while( c>='0' && c<='9' )
  {
   printf("%c", c);
   scanf("%c", &c);
   if( c<'0' || c>'9' )
   {
    printf(" ");
   }
  }
 
  if( ')' == c )
  {
   Pop(&s, &e);
   while( '(' != e )
   {
    printf("%c ", e);
    Pop(&s, &e);
   }
  }
  else if( '+'==c || '-'==c )
  {
   if( !StackLen(s) )
   {
    Push(&s, c);
   }
   else
   {
    do
    {
     Pop(&s, &e);
     if( '(' == e )
     {
      Push(&s, e);
     }
     else
     {
      printf("%c ", e);
     }
    }while( StackLen(s) && '('!=e );
    Push(&s, c);
   }
  }
  else if( '*'==c || '/'==c || '('==c )
  {
   Push(&s, c);
  }
  else if( '#'== c )
  {
   break;
  }
  else
  {
   printf("\n出錯(cuò):輸入格式錯(cuò)誤!\n");
   return -1;
  }
 
  scanf("%c", &c);
 }
 
 while( StackLen(s) )
 {
  Pop(&s, &e);
  printf("%c ", e);
 }
 
 return 0;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • c語言實(shí)現(xiàn)簡(jiǎn)易版三子棋(附完整代碼)

    c語言實(shí)現(xiàn)簡(jiǎn)易版三子棋(附完整代碼)

    大家好,本篇文章主要講的是c語言實(shí)現(xiàn)簡(jiǎn)易版三子棋(附完整代碼),感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • vscode終端中打不開conda虛擬包管理的解決

    vscode終端中打不開conda虛擬包管理的解決

    本文主要介紹了vscode終端中打不開conda虛擬包管理的解決,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • Qt中QSettings配置文件的讀寫和應(yīng)用場(chǎng)景詳解

    Qt中QSettings配置文件的讀寫和應(yīng)用場(chǎng)景詳解

    這篇文章主要給大家介紹了關(guān)于Qt中QSettings配置文件的讀寫和應(yīng)用場(chǎng)景的相關(guān)資料,QSettings能讀寫配置文件,當(dāng)配置文件不存在時(shí),可生成配置文件,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • QT中如何讀寫ini配置文件

    QT中如何讀寫ini配置文件

    ini文件在windows系統(tǒng)中可以存儲(chǔ)需要持久保存的配置信息,QT界面中如何實(shí)現(xiàn)手動(dòng)讀取參數(shù)存放的位置,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++中based for循環(huán)的實(shí)現(xiàn)

    C++中based for循環(huán)的實(shí)現(xiàn)

    C++中的范圍for循環(huán)是一種簡(jiǎn)潔的遍歷容器的方法,本文主要介紹了C++中based for循環(huán)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02
  • C語言中無符號(hào)數(shù)和有符號(hào)數(shù)之間的運(yùn)算

    C語言中無符號(hào)數(shù)和有符號(hào)數(shù)之間的運(yùn)算

    C語言中有符號(hào)數(shù)和無符號(hào)數(shù)進(jìn)行運(yùn)算默認(rèn)會(huì)將有符號(hào)數(shù)看成無符號(hào)數(shù)進(jìn)行運(yùn)算,其中算術(shù)運(yùn)算默認(rèn)返回?zé)o符號(hào)數(shù),邏輯運(yùn)算當(dāng)然是返回0或1了。下面通過一個(gè)例子給大家分享C語言中無符號(hào)數(shù)和有符號(hào)數(shù)之間的運(yùn)算,一起看看吧
    2017-09-09
  • 詳解C++編程中向函數(shù)傳遞引用參數(shù)的用法

    詳解C++編程中向函數(shù)傳遞引用參數(shù)的用法

    這篇文章主要介紹了詳解C++編程中向函數(shù)傳遞引用參數(shù)的用法,包括使函數(shù)返回引用類型以及對(duì)指針的引用,需要的朋友可以參考下
    2016-01-01
  • C++11語法之右值引用的示例講解

    C++11語法之右值引用的示例講解

    右值引用,一般是在深拷貝的類,實(shí)現(xiàn)移動(dòng)構(gòu)造和移動(dòng)賦值,能夠解決左值引用無法做到的傳返回值的效率問題,下面跟隨小編一起學(xué)習(xí)下C++11語法之右值引用的問題
    2022-04-04
  • Microsoft Visual Studio 2022的安裝與使用詳細(xì)教程

    Microsoft Visual Studio 2022的安裝與使用詳細(xì)教程

    Microsoft Visual Studio 2022是Microsoft Visual Studio軟件的一個(gè)高版本,能夠編寫和執(zhí)行C/C++代碼,具有強(qiáng)大的功能,是開發(fā)C/C++程序的主流軟件,這篇文章主要介紹了Microsoft Visual Studio 2022的安裝與使用詳細(xì)教程
    2024-01-01
  • c++中將二維數(shù)組元素變換為逆向存放的實(shí)現(xiàn)代碼

    c++中將二維數(shù)組元素變換為逆向存放的實(shí)現(xiàn)代碼

    編程將一個(gè)二維數(shù)組元素變換為逆向存放,即按元素在內(nèi)存中的物理排列位置,第一個(gè)元素變成倒數(shù)第一個(gè)元素,第二個(gè)元素變成倒數(shù)第二個(gè)元素,依此類推
    2020-11-11

最新評(píng)論

定南县| 玉树县| 法库县| 建始县| 托里县| 合作市| 呼玛县| 嵩明县| 灵宝市| 凤庆县| 宁陵县| 水城县| 大方县| 丰城市| 上饶市| 葫芦岛市| 大厂| 阿瓦提县| 新津县| 噶尔县| 濉溪县| 铁岭县| 临猗县| 六枝特区| 修武县| 濉溪县| 潼南县| 临猗县| 昌江| 大宁县| 根河市| 阳山县| 淮阳县| 阿坝县| 望奎县| 贵溪市| 滨海县| 景宁| 海南省| 法库县| 郓城县|