欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

請用棧的特性編寫一個程序,使得程序輸出后綴表達式

分析如下:

STEP1:

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

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

STEP2:

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

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

STEP3:

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

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

STEP4:

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

緊接著是符號“*”,直接入棧

STEP5:

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

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

最后把剛剛的那個加號入棧,操作如下圖:

STEP6:

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

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

STEP7:

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

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

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

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

代碼實現(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("請輸入中綴表達式,以#作為結(jié)束標志:");
 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出錯:輸入格式錯誤!\n");
   return -1;
  }
 
  scanf("%c", &c);
 }
 
 while( StackLen(s) )
 {
  Pop(&s, &e);
  printf("%c ", e);
 }
 
 return 0;
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C語言結(jié)構(gòu)體鏈表和指針實現(xiàn)學生管理系統(tǒng)

    C語言結(jié)構(gòu)體鏈表和指針實現(xiàn)學生管理系統(tǒng)

    這篇文章主要介紹了C語言結(jié)構(gòu)體鏈表和指針實現(xiàn)學生管理系統(tǒng),包括學生檔案管理子系統(tǒng)和學生成績管理子系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語言自研定時器計劃任務語法詳解

    C語言自研定時器計劃任務語法詳解

    市面主流定時器計劃任務語法: cron ,但是使用起來非常難受,設計的比較非人性話語法,我想一般人都沒幾個記住的,所以本文將自研定時器計劃任務語法,需要的可以參考一下
    2022-09-09
  • C++編寫實現(xiàn)飛機大戰(zhàn)

    C++編寫實現(xiàn)飛機大戰(zhàn)

    這篇文章主要為大家詳細介紹了C++編寫實現(xiàn)飛機大戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++實現(xiàn)LeetCode(71.簡化路徑)

    C++實現(xiàn)LeetCode(71.簡化路徑)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(71.簡化路徑),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • OpenCV和C++實現(xiàn)圖像的翻轉(zhuǎn)(鏡像)、平移、旋轉(zhuǎn)、仿射與透視變換

    OpenCV和C++實現(xiàn)圖像的翻轉(zhuǎn)(鏡像)、平移、旋轉(zhuǎn)、仿射與透視變換

    這篇文章主要給大家介紹了關于OpenCV和C++實現(xiàn)圖像的翻轉(zhuǎn)(鏡像)、平移、旋轉(zhuǎn)、仿射與透視變換的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-09-09
  • C語言利用cJSON解析JSON格式全過程

    C語言利用cJSON解析JSON格式全過程

    cJSON是用于解析json格式字符串的一套api,非常好用,下面這篇文章主要給大家介紹了關于C語言利用cJSON解析JSON格式的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • C++面向?qū)ο缶幊讨鰳?gòu)詳解

    C++面向?qū)ο缶幊讨鰳?gòu)詳解

    這篇文章主要為大家詳細介紹了C++面向?qū)ο缶幊讨鰳?gòu),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 自己實現(xiàn)strcpy函數(shù)的實現(xiàn)方法

    自己實現(xiàn)strcpy函數(shù)的實現(xiàn)方法

    本篇文章介紹了,自己實現(xiàn)strcpy函數(shù)的實現(xiàn)方法。需要的朋友參考下
    2013-05-05
  • C++基于LINUX的文件操作

    C++基于LINUX的文件操作

    這篇文章主要為大家介紹了C++基于LINUX的文件操作示例知識擴充,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Qt+Opencv實現(xiàn)梯度矯正功能

    Qt+Opencv實現(xiàn)梯度矯正功能

    這篇文章主要為大家詳細介紹了Qt如何結(jié)合Opencv實現(xiàn)梯度矯正功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-04-04

最新評論