① 增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。