亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言實現(xiàn)中綴表達式轉換為后綴表達式

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

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

中綴表達式轉換為后綴表達式(思路)

1.創(chuàng)建棧

2.從左向右順序獲取中綴表達式

a.數字直接輸出
b.運算符

情況一:遇到左括號直接入棧,遇到右括號將棧中左括號之后入棧的運算符全部彈棧輸出,同時左括號出棧但是不輸出。

情況二:遇到乘號和除號直接入棧,直到遇到優(yōu)先級比它更低的運算符,依次彈棧。

情況三:遇到加號和減號,如果此時棧空,則直接入棧,否則,將棧中優(yōu)先級高的運算符依次彈棧(注意:加號和減號屬于同一個優(yōu)先級,所以也依次彈棧)直到??栈騽t遇到左括號為止,停止彈棧。(因為左括號要匹配右括號時才彈出)。

情況四:獲取完后,將棧中剩余的運算符號依次彈棧輸出

例:比如將:2*(9+6/3-5)+4轉化為后綴表達式 2 9 6 3 / +5 - * 4 +

轉換算法代碼如下:

/*中綴轉后綴函數*/
void Change(SqStack *S,Elemtype str[])
{
 int i=0;
 Elemtype e;
 InitStack(S);
 while(str[i]!='\0')
 {
 while(isdigit(str[i])) 
 {/*過濾數字字符,直接輸出,直到下一位不是數字字符打印空格跳出循環(huán) */
 printf("%c",str[i++]);
 if(!isdigit(str[i]))
 {
 printf(" ");
 }
 }
 /*加減運算符優(yōu)先級最低,如果棧頂元素為空則直接入棧,否則將棧中存儲
 的運算符全部彈棧,如果遇到左括號則停止,將彈出的左括號從新壓棧,因為左
 括號要和又括號匹配時彈出,這個后面單獨討論。彈出后將優(yōu)先級低的運算符壓入棧中*/
 if(str[i]=='+'||str[i]=='-')
 {
 if(!StackLength(S))
 {
 PushStack(S,str[i]);
 }
 else
 {
 do
 {
  PopStack(S,&e);
  if(e=='(')
  {
  PushStack(S,e);
  }
  else
  {
  printf("%c ",e);
  }
 }while( StackLength(S) && e != '(' );
 
 PushStack(S,str[i]);
 }
 }
 /*當遇到右括號是,把括號里剩余的運算符彈出,直到匹配到左括號為止
 左括號只彈出不打?。ㄓ依ㄌ栆膊粔簵#?/
 else if(str[i]==')')
 {
 PopStack(S,&e);
 while(e!='(')
 {
 printf("%c ",e);
 PopStack(S,&e);
 }
 }
 /*乘、除、左括號都是優(yōu)先級高的,直接壓棧*/
 else if(str[i]=='*'||str[i]=='/'||str[i]=='(')
 {
 PushStack(S,str[i]);
 }
 
 else if(str[i]=='\0')
 {
 break;
 }
 
 else
 {
 printf("\n輸入格式錯誤!\n");
 return ;
 }
 i++;
 }
 /*最后把棧中剩余的運算符依次彈棧打印*/
 while(StackLength(S))
 {
 PopStack(S,&e);
 printf("%c ",e);
 }
}


完整代碼如下:

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h> 
#include<assert.h>

#define INITSIZE 20
#define INCREMENT 10
#define MAXBUFFER 20
#define LEN sizeof(Elemtype)

/*棧的動態(tài)分配存儲結構*/ 
typedef char Elemtype;
typedef struct{
 Elemtype *base;
 Elemtype *top;
 int StackSize;
}SqStack;

/*初始化棧*/
void InitStack(SqStack *S)
{
 S->base=(Elemtype*)malloc(LEN*INITSIZE);
 assert(S->base !=NULL);
 S->top=S->base;
 S->StackSize=INITSIZE;
}

/*壓棧操作*/ 
void PushStack(SqStack *S,Elemtype c)
{
 if(S->top - S->base >= S->StackSize)
 {
 S->base=(Elemtype*)realloc(S->base,LEN*(S->StackSize+INCREMENT));
 assert(S->base !=NULL);
 S->top =S->base+S->StackSize;
 S->StackSize+=INCREMENT;
 }
 *S->top++ = c;
}
/*求棧長*/
int StackLength(SqStack *S)
{
 return (S->top - S->base);
}
/*彈棧操作*/
int PopStack(SqStack *S,Elemtype *c)
{
 if(!StackLength(S))
 {
 return 0;
 }
 *c=*--S->top;
 return 1;
}

/*中綴轉后綴函數*/
void Change(SqStack *S,Elemtype str[])
{
 int i=0;
 Elemtype e;
 InitStack(S);
 while(str[i]!='\0')
 {
 while(isdigit(str[i])) 
 {/*過濾數字字符,直接輸出,直到下一位不是數字字符打印空格跳出循環(huán) */
 printf("%c",str[i++]);
 if(!isdigit(str[i]))
 {
 printf(" ");
 }
 }
 /*加減運算符優(yōu)先級最低,如果棧頂元素為空則直接入棧,否則將棧中存儲
 的運算符全部彈棧,如果遇到左括號則停止,將彈出的左括號從新壓棧,因為左
 括號要和又括號匹配時彈出,這個后面單獨討論。彈出后將優(yōu)先級低的運算符壓入棧中*/
 if(str[i]=='+'||str[i]=='-')
 {
 if(!StackLength(S))
 {
 PushStack(S,str[i]);
 }
 else
 {
 do
 {
  PopStack(S,&e);
  if(e=='(')
  {
  PushStack(S,e);
  }
  else
  {
  printf("%c ",e);
  }
 }while( StackLength(S) && e != '(' );
 
 PushStack(S,str[i]);
 }
 }
 /*當遇到右括號是,把括號里剩余的運算符彈出,直到匹配到左括號為止
 左括號只彈出不打?。ㄓ依ㄌ栆膊粔簵#?/
 else if(str[i]==')')
 {
 PopStack(S,&e);
 while(e!='(')
 {
 printf("%c ",e);
 PopStack(S,&e);
 }
 }
 /*乘、除、左括號都是優(yōu)先級高的,直接壓棧*/
 else if(str[i]=='*'||str[i]=='/'||str[i]=='(')
 {
 PushStack(S,str[i]);
 }
 
 else if(str[i]=='\0')
 {
 break;
 }
 
 else
 {
 printf("\n輸入格式錯誤!\n");
 return ;
 }
 i++;
 }
 /*最后把棧中剩余的運算符依次彈棧打印*/
 while(StackLength(S))
 {
 PopStack(S,&e);
 printf("%c ",e);
 }
}

int main()
{
 Elemtype str[MAXBUFFER];
 SqStack S;
 gets(str);
 Change(&S,str);
 return 0;
}

運行效果截圖如下:

如何實現(xiàn)將中綴表達式轉換成后綴表達式后計算值

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

相關文章

  • 最長公共子字符串的使用分析

    最長公共子字符串的使用分析

    本篇文章是對最長公共子字符串的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 深入了解c++11 移動語義與右值引用

    深入了解c++11 移動語義與右值引用

    這篇文章主要介紹了c++ 移動語義與右值引用的相關資料,幫助大家更好的理解和學習c++,感興趣的朋友可以了解下
    2020-08-08
  • C語言文件操作實現(xiàn)數據持久化(幫你快速了解文件操作函數)

    C語言文件操作實現(xiàn)數據持久化(幫你快速了解文件操作函數)

    持久數據其實就是將數據保存到數據庫,下面這篇文章主要給大家介紹了關于C語言文件操作實現(xiàn)數據持久化(幫你快速了解文件操作函數)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • C語言數據結構與算法之排序總結(一)

    C語言數據結構與算法之排序總結(一)

    這篇文章主要介紹了數據結構與算法中的插入類和交換類的各種排序,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2021-12-12
  • VC++中HTControl控件類之CHTRichEdit富文本編輯控件實例

    VC++中HTControl控件類之CHTRichEdit富文本編輯控件實例

    這篇文章主要介紹了VC++中HTControl控件類之CHTRichEdit富文本編輯控件,是一個比較實用的功能,需要的朋友可以參考下
    2014-08-08
  • OpenCV實現(xiàn)車牌定位(C++)

    OpenCV實現(xiàn)車牌定位(C++)

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)車牌定位,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C語言深入分析浮點型數據存儲

    C語言深入分析浮點型數據存儲

    使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內存位置。這意味著,當您創(chuàng)建一個變量時,就會在內存中保留一些空間。您可能需要存儲各種數據類型的信息,操作系統(tǒng)會根據變量的數據類型,來分配內存和決定在保留內存中存儲什么
    2022-08-08
  • C++面試基礎之static關鍵字詳解

    C++面試基礎之static關鍵字詳解

    這篇文章主要給大家介紹了關于C++面試基礎之static關鍵字的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-02-02
  • 學生成績管理系統(tǒng)C語言代碼實現(xiàn)

    學生成績管理系統(tǒng)C語言代碼實現(xiàn)

    這篇文章主要為大家詳細介紹了C語言代碼實現(xiàn)學生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 基于MFC實現(xiàn)單個文檔的文件讀寫

    基于MFC實現(xiàn)單個文檔的文件讀寫

    這篇文章主要為大家詳細介紹了如何基于MFC實現(xiàn)單個文檔的文件讀寫功能,文中的示例代碼講解詳細,對我們學習有一定幫助,感興趣的可以了解一下
    2022-07-07

最新評論