導航:首頁 > 源碼編譯 > 前綴表達式演算法

前綴表達式演算法

發布時間:2023-05-13 13:44:00

① 增1減1運算符,前綴運算和後綴運算請大大們詳細舉例講解,為什麼有變數的值和表達式的值


舉個例子

下面的幾個表達式都在 int i=0 的基礎上運算
1:int j = i++;這里i=0、表前槐做達式的值j=1;
2:int j = ++i;這里i=1、表達式的值j=1;
3:int j = i--;這里i=0、表達式的明轎值j=-1;
4:int j = --i;這里i=-1、表達式的值j=-1;

這4個例子你應該能明白一點吧
其實就是兩個重點
1:前綴會在表達式運算前獲得新值慧衡、後綴在表達式運算後獲得新值
2:表達式和變數的值是兩個概念,要注意分離

② 中綴表達式轉前綴表達式

全是自己寫的~~給分~~
#include<iostream>
#include<string>
using namespace std;
#define maxSize 100
class Stack{
public:
Stack() {top = -1 ; };
bool Push(char a)
{
if(!IsFull())
c[++top] = a;
else
return false;
return true;
}
bool pop(char &a)
{
if(!IsEmpty())
a = c[top--];
else
return false;
return true;
}
bool getTop(char &a)
{
if(!IsEmpty())
a = c[top];
else
return false;
return true;
}
bool IsEmpty()
{
return top == -1 ? true:false ;
}
bool IsFull()
{
return top == (maxSize-1) ? true:false ;
}
private:
char c[maxSize];
int top;
};
int isp(char a)
{
if(a == '#')
return 0;
if(a == '(')
return 6;
if(a == '*' || a == '/')
return 4;
if(a == '+' || a == '-')
return 2;
if(a == ')')
return 1;
return false;
}
int icp(char a)
{
if(a == '#')
return 0;
if(a == '(')
return 1;
if(a == '*'攜豎 || a == '/')
return 5;
if(a == '+' || a == '-')
return 3;
if(a == ')')
return 6;
return false;
}
void main()
{
cout<<"本程序將為您把中綴表達式轉換成前綴表達式。"<<endl<<endl;
string s;
char c[100];
char a,b;
cout<<"辯頌大請櫻鉛輸入一個多項式的運算。"<<endl;
cin>>s;
s = "#"+s;
int m,n;
for(m=n=0 ; s[n]!='\0' ; n++);
n--;
Stack z;
z.Push('#');
while(n >= 0 && !z.IsEmpty())
if(isdigit(s[n]))
c[m++] = s[n--];
else
{
z.getTop(a);
if(isp(a) < icp(s[n]))
z.Push(s[n--]);
else if(isp(a) > icp(s[n]))
z.pop(b) , c[m++] = b;
else
{
z.pop(b);
if(b == ')')
n--;
}
}
m--;
cout<<endl<<"將以上多項式運算轉換為前綴表達式為:"<<endl;
for( ; m >=0 ; m--)
cout<<" "<<c[m];
}

③ 中綴表達式如何轉換為前後綴表達式

1、中綴表達式變後綴的演算法:遇到操作數,物隱直接輸出。

④ 從鍵盤輸入一個前綴表達式,運算符可以包括+-*/(),操作數任意,中間不可以有空格,編寫c語言演算法

#include
#include
#include
int main(void)
{
float a,b,f;
int ctl=0,p;
char Cflag='Y';
char c;
char sa[10],sb,sc[10];
while((Cflag == 'Y') || (Cflag == 'y') )
{
for(p=0;p sb='\0';
for(p=0;p p=0;
ctl=1;
printf("加、蠢殲模改歷減、乘、除四則運算算式:\n");
scanf("%c", &c);
while(c!='\n')
{
if (c>='0' && c {
if ( ctl==1 ) sa[p]=c;
if ( ctl==2 ) sc[p]=c;
p++;

}else if ( c=='+'||c=='-'||c=='*'||c=='/')
{
ctl=2;
sa[p]='\0';
sb=c;
p=0;
}

scanf("%c", &c);
}
sc[p]='\0';
//printf("[%s%c%s]",sa,sb,sc);
a=atof(sa);
b=atof(sc);
switch(sb)
{
case '+':
f=a+b;
break;
case '-':
f=a-b;
break;
case '*':
f=a*b;
break;
case '/':
f=a/b;
break;
defalt:
;
}
printf("[%.2f%c%.2f]=%.2f"帶緩,a,sb,b,f);

printf("\n是否繼續計算(Y/N)?");
scanf("%c", &Cflag);
getchar();

}
}

⑤ 如何把算術表達式轉化為後綴表達式有個例子,a

一.表達式的三種形式:
中綴表達式:運算符放在兩個運算對象中間,如:(2+1)*3
後綴表達式:不包含括弧,運算符放在兩個運算對象的後面,所有的計算按運算符出現的順序,嚴格從左向右進行(不再考慮運算符的優先規則,如:2 1 + 3 *
前綴表達式:同後綴表達式一樣,不包含括弧,運算符放在兩個運算兆襪中對象的前面,如:* + 2 1 3

二.表達式的轉換:
將中綴表達式轉換為後綴表達式好基的演算法思想:
·數字時,加入後綴表達式;
·運算符:
a. 若為最低級的運算符,入棧;
b. 若為 '(',入棧;
c. 若為 ')',則把棧中的的運算符加入後綴表達式中,直到 '(',從棧中刪除'(' ;
d. 若為不是最低級的運算符,則將從棧頂到第一個優先順序不大於(小於,低於或等於)它的運算符(或 '(',但優先滿足前一個條件)之間的運算符加入後綴表達式中,該運算符再入棧;

>>這句話不好理解,可以說成這樣,從棧頂開始,依次彈出比當前處理的運算符優先順序高的運算符,直到一個比它優先順序低的或者遇到了一個左括弧就停止。

·當掃描的中綴表達式結束時,棧中的的所有運算符出棧;

運用後綴表達式進行計算的具體做法:
·建立一個棧S
·從左到右讀後綴表達式,讀到數字就將它轉換為數族山值壓入棧S中,讀到運算符則從棧中依次彈出兩個數分別到Y和X,然後以「X 運算符 Y」的形式計算機出結果,再壓加棧S中
·如果後綴表達式未讀完,就重復上面過程,最後輸出棧頂的數值則為結束

三.表達式之間的轉換
這里我給出一個中綴表達式:a+b*c-(d+e)
第一步:按照運算符的優先順序對所有的運算單位加括弧:式子變成拉:((a+(b*c))-(d+e))
第二步:轉換前綴與後綴表達式
前綴:把運算符號移動到對應的括弧前面
則變成拉:-( +(a *(bc)) +(de))
把括弧去掉:-+a*bc+de 前綴式子出現
後綴:把運算符號移動到對應的括弧後面
則變成拉:((a(bc)* )+ (de)+ )-
把括弧去掉:abc*+de+- 後綴式子出現
發現沒有,前綴式,後綴式是不需要用括弧來進行優先順序的確定的。

如表達式:3+(2-5)*6/3

後綴表達式 棧

3 +

3 +(

3 2 +(-

3 2 5 - +

3 2 5 - +*

3 2 5 - 6 +*/

3 2 5 - 6 3 +*/

3 2 5 - 6 3 / * +

⑥ C語言代碼補全:前綴表達式求值

#include<stdio.h>
#include<stdlib.h>
#define MAXNUM 100
typedef struct Node /罩兄/定義存儲中綴表達式的結點類型
{int data;
int data1;
char data2;
struct Node *next;
}Lnode;

typedef struct Node2 //定義存儲基帆前綴表達式的結點類型
{int data;
int data1;
char data2;
struct Node2 *next;
struct Node2 *prior;
}Lnode2;

typedef int selemtype1; //定義運算數棧的結點

typedef struct //定義運算數棧的類型
{selemtype1 *base;
selemtype1 *top;
}sqstack1;

void InitStack1(sqstack1 &s) //新建一個空運算數棧
{s.base=(selemtype1 *)malloc(MAXNUM*sizeof(selemtype1));
s.top=s.base;
if(!s.base) printf("出錯:申請空間失敗!\n");
}

void Push1(sqstack1 &s,selemtype1 &e) //運算數棧,入棧:插入元素e為新的棧頂元素
{ if(s.top-s.base>=MAXNUM)
printf("出錯:表達式過長!1\n");
*s.top++ =e;
}

void GetTop1(sqstack1 s,selemtype1 &e) //運算數棧,用e返回棧頂元素 {e=*(s.top-1);
}

void Popopnd1(sqstack1 &s,selemtype1 &e) //運算數棧,退棧:刪除棧頂物鋒襲元素,並用e返回其值
{e=*--s.top;
}

int stackempy1(sqstack1 s) //運算數棧,若為空棧返回1,否則返回0 {if(s.top==s.base) return 1;
else return 0;
}

typedef char selemtype2; //定義運算符棧的結點類型

typedef struct //定義運算符棧類型
{selemtype2 *base;
selemtype2 *top;
}sqstack2;

void InitStack2(sqstack2 &s) //新建一個空運算符棧
{s.base=(selemtype2 *)malloc(MAXNUM*sizeof(selemtype2));
s.top=s.base;
if(!s.base) printf("出錯:申請空間失敗!\n");
}

void Push2(sqstack2 &s,selemtype2 &e) //運算符棧,入棧:插入元素e為新的棧頂元素
{ if(s.top-s.base>=MAXNUM)
printf("出錯:表達式過長!2\n");
*s.top++ =e;
}

void GetTop2(sqstack2 s,selemtype2 &e) //運算符棧,用e返回棧頂元素 {e=*(s.top-1);
}

void Popopnd2(sqstack2 &s,selemtype2 &e) //運算符棧,退棧:刪除棧頂元素,並用e返回其值
{e=*--s.top;
}

int stackempy2(sqstack2 s) //運算符棧,若為空棧返回1,否則返回0 {if(s.top==s.base) return 1;
else return 0;
}

⑦ 求前綴表達式的值現實中的作用

1、在計算機科學中,前綴表達式求值可以用於編譯器的語法分析,以及計算機程序的解釋和執行余拿李。
2、在數學中,前綴表達式求值可以用於解決復雜的數學表達式,如求敏塌解微積分、線性代數等問題。
3、在計算機網路中,前綴表達式求值可以用於路由演算法,以豎遲及計算機網路中的路由表的構建。

⑧ 前綴中綴後綴表達式的轉換,能幫一下嗎

思路的話其實很簡單,就是構建一棵二叉樹,根行虧節點和中間節點為運算符,葉子結點為運算數字。如 a + b*c, 構建為二叉樹的話,檔岩神就如下圖: +a * b c對於該二叉樹,使用不同的遍歷方式就可以得到不同的表達式了。遍歷的代碼很簡單就不多說了。因此,你的問題主要可以分解為3個小問題:1。將後綴表達式轉換為二叉樹 該方法是最簡單的。如a + b*c 的後綴表達式為 bc*a+.處理步驟如下: 1。建立一個棧S
2。從左到右讀後綴表達式,讀到數字就創建葉子節點,節點值為數字值。將節點壓入棧S中,讀到運算符則創建中間節點,並從棧中依次彈出兩個節點分別為Y和X,作為中間節點的左右子節點,然後以「X 運算符 Y」的形式計算機出中間節點的值,再將此中間節點壓加棧S中 3。就重復第二步直至後綴表達式結束,此時棧頂的節點就是二叉樹的根節點了。2。將中綴表達式轉換為二叉樹 按照上一個回答者的方法將中綴表達式轉為後綴表達式,然後調用後綴表達式生成二叉樹的解法即可。3。將前綴表達式轉換為二叉樹 將前綴表達式直接取反即為後綴表達式。 如前綴表達式為+*bca,對應棗液的後綴表達式為acb*+。因此,我們只需要字元串取反,然後調用後綴表達式的方法生成二叉樹即可。

⑨ 用棧將一個將中綴表達式轉換為前綴表達式的演算法

1)求輸入串的逆序。

2)檢查輸入的下一元素。

3)假如是操作數,把它添加到輸出串中。

4)假如是閉括弧,將它壓棧。

5)假如是運算符,則

i)假如棧空,此運算符入棧。

ii)假如棧頂是閉括弧,此運算符入棧。

iii)假如它的優先順序高於或等於棧頂運算符,此運算符入棧。

iv)否則,棧頂運算符出棧並添加到輸出串中,重復步驟5。

6)假如是開括弧,棧中運算符逐個出棧並輸出,直到遇到閉括弧。閉括弧出棧並丟棄。

7)假如輸入還未完畢,跳轉到步驟2。

8)假如輸入完畢,棧中剩餘的所有操作符出棧並加到輸出串中。

9)求輸出串的逆序。*/

#include<iostream>

#include<string>

using namespace std;

char stack[50];//定義順序棧,其中第一個元素表示棧為空;

int top=0;//棧頂指針,為0表示棧為空;

int level(char op)//判斷運算符級別函數;其中* /的級別為2,+ -的級別為1;

{

int level;

switch(op)

{

case'+':

case'-':level=1; break;

case'*':

case'/':level=2; break;

default:level=0;break;

}

return level;

}

bool isOperator(char op)//判斷輸入串中的字元是不是操作符,如果是返回true

{

if(op=='+'||op=='-'||op=='*'||op=='/')

return true;

else

return false;

}

string convert(string s)//將一個中綴串轉換為後綴串,

{

string output="";//輸出串

for(int i=s.length()-1;i>=0;)//1)求輸入串的逆序。

{

if(s[i]>=48&&s[i]<=57)

output=output+s[i];//3)假如是操作數,把它添加到輸出串中。

if(s[i]==')')//4)假如是閉括弧,將它壓棧。

{

top++;

stack[top]=s[i];

}

while(isOperator(s[i]))//如果是運算符,執行演算法(5)對應操作;

{

if(top==0||stack[top]==')'||level(s[i])>=level(stack[top]))

{

top++;

stack[top]=s[i];

break;

}

else

{

output=output+stack[top];

top--;

}

}

if(s[i]=='(')//6)假如是開括弧,棧中運算符逐個出棧並輸出,直到遇到閉括弧。閉括弧出棧並丟棄。

{

while(stack[top]!=')')

{

output=output+stack[top];

top--;

}

top--;

}

i--;//7)假如輸入還未完畢,跳轉到步驟2。

}

while(top!=0)//8)假如輸入完畢,棧中剩餘的所有操作符出棧並加到輸出串中。

{

output=output+stack[top];

top--;

}

return output;

}

int main()

{

string input,output;

cout<<"請輸入串:";

cin>>input;

output=convert(input);

cout<<"後綴串為:";

for(int i=output.length()-1;i>=0;i--)//9)求輸出串的逆序。

cout<<output[i];

cout<<endl;

return 0;

}

⑩ 請教波蘭表達式前綴表達式的演算法

對於一個前綴表達式的求值而言,首先要從右至左掃描表達式,從右邊第一個字元開始判斷,如果當前字元是數字則一直到數字串的末尾再記錄下來,如果是運算符,則將右邊離得最近的兩個「數字串」作相應的運算,以此作為一個新的「數字串」並記錄下來。一直掃描到表達式的最左端時,最後運算的值也就是表達式的值。例譽拆型如,前御睜綴表達式「- 1 + 2 3「的求值,掃描到3時,記錄下這個數字串,掃描到2時,記錄下這個數字串,當掃描到+時,將+右移做相鄰兩數字串的運算符,記為2+3,結果為5,記錄下這個新數字串,並繼續向左掃描,掃描到1時,記錄下這個數字串,掃描到-時,將-右慶猜移做相鄰兩數字串的運算符,記為1-5,結果為-4,所以表達式的值為-4。

閱讀全文

與前綴表達式演算法相關的資料

熱點內容
非科班程序員自學 瀏覽:799
壓縮泡沫鞋底底材 瀏覽:217
程序員職場第一課2正確的溝通 瀏覽:677
遇到不合法app應該怎麼辦 瀏覽:90
匯編程序編譯後的文件 瀏覽:77
大智慧均線源碼 瀏覽:371
單片機排阻的作用 瀏覽:213
滴滴金融app被下架如何還款 瀏覽:210
jpg轉換成pdf免費軟體 瀏覽:741
范里安pdf 瀏覽:443
偽造pdf 瀏覽:75
能刪除android文件夾嗎 瀏覽:446
LINUX使用V2ray 瀏覽:797
找人幫忙注冊app推廣是什麼 瀏覽:820
獨立伺服器如何恢復初始化 瀏覽:11
優秀到不能被忽視pdf 瀏覽:316
導遊程序員家政 瀏覽:586
22乘28的快速演算法 瀏覽:338
軟通動力程序員節2021 瀏覽:847
安卓系統如何卸載安裝包 瀏覽:872