簡單算術表示式C 實現

2021-07-05 15:13:04 字數 2838 閱讀 9270

輸入的算術表示式是中綴表示式,由於操作符的優先順序不同,不能直接進行求解,而字尾表示式的計算不需要判別操作符的優先順序,所以我實現算術表示式的思路是:1)應用堆疊將中綴表示式轉化為字尾表示式,2)用堆疊實現字尾表示式求值。

用堆疊實現字尾表示式求值的過程:從左到右讀入字尾表示式的各項,並根據讀入的物件判斷執行何種操作,有以下3中情況:

1) 當讀入的是乙個運算數時,把它壓入棧中;

2) 當讀入的是乙個運算子時,就從棧中彈出適當數量的運算數並進行計算,計算結果再壓回到棧中;

3) 處理完整個字尾表示式之後,棧頂上的元素就是表示式的結果。

應用堆疊將中綴表示式轉換為字尾表示式的基本過程為:從頭到尾讀取中綴表示式的每個物件,對不同物件按不同情況處理:

1) 如果遇到空格則認為是分隔符,無需處理;

2) 若遇到運算數,則直接輸出;

3) 若是左括號,則將其壓入至棧中;

4) 若遇到的是右括號,表明括號內的中綴表示式已經掃瞄完畢,將棧頂的運算子彈出並輸出,直到遇到左括號(左括號也出棧,但不輸出);

5) 若遇到的是運算子,若該運算子的優先順序大於棧頂運算子的優先順序,則把它壓入棧中;若該運算子的優先順序小於等於棧頂運算子時,將棧頂運算子彈出並輸出,在比較新的棧頂運算子,按這樣的處理方法,直到該運算子大於棧頂運算子優先順序為止,然後將該運算子壓棧;

6) 若中綴表示式中的各物件處理完畢,則把堆疊中保留的運算子一併輸出。

在**實現的過程中,首先我們要定義乙個棧,因為在字尾表示式求值的過程中,棧是用來存運算數的;在中綴轉換為字尾表示式的過程中,棧是用來存放操作符的。所以在實現棧的時候我用了模板。棧的實現如下:

// stack.h

#include

template

class stack;

template

void stack::push(const t& a)

template

t stack::pop()

template

bool stack::empty()

template

t stack::peek()

定義相應的運算子的優先順序,我用整數的大小來定義優先順序的大小,對應的函式實現如下:

int op_pri(const

char& a)

}

在實現優先順序的時候,當輸入為左括號時,需要無條件進棧,所以左括號的優先順序要最高。碰到右括號時要無條件出棧直到那個棧頂的操作符是左括號。所以右括號的優先順序我定義為最低。但是要注意當當前的運算子為右括號時,證明括號內的中綴表示式已經掃瞄完畢,要將棧頂運算子彈出,直到左括號(這時左括號出棧,但是不用加入到運算中);還要注意當運算子是左括號時,因為我把左括號定義為了最高優先順序了,如果按正常的情況,當棧頂是左括號時,應當會馬上輸出但是這不符合我們的要求,希望的是緊接的運算子能無條件的入棧,所以在**的實現過程中這是中特殊的情況用個if語句強調。

接下來是對中綴轉換為字尾表示式實現的最主要的功能函式,就是運算子的出入棧的情況:

int oper_cp(const

char&a, const

char& b)

else

return

0;}

有了上述兩個函式的支援,接下來就是直接對中綴表示式求值的函式,這些問題只是邏輯問題,我的**實現如下:

void exp(stack&val, stack&op);

string s{};

doelse

}if (c == '+' || c == '-' || c == '*' || c == '/' || c == ')' || c == '(')

while (1)

intm = oper_cp(c, b);

if (m == 1)

if (m == 0)

continue;

}if (m == -1)}}

} while (c != '\n');

while (!op.empty())

}}

呼叫這些函式的main函式如下:

#include

#include

#include "stack.h"

using

namespace

std;

void

exp(stack &val, stack &op);

int op_pri(const

char& );

int oper_cp(const

char&a, const

char& b);

int main()

int oper_cp(const

char&a, const

char& b)

else

return0;}

int op_pri(const

char& a)

}void

exp(stack &val, stack &op);

string s{};

doelse

}if (c == '+' || c == '-' || c == '*' || c == '/' || c == ')' || c == '(')

while (1)

int m = oper_cp(c, b);

if (m == 1)

if (m == 0)

continue;

}if (m == -1)}}

} while (c != '\n');

while (!op.empty())

}}

簡單算術表示式求值

題目 利用cin,getline將輸入分成前半部分和後半部分,便於操作 例如 32 3 分成數字部分 32字串部分 3 include using namespace std intmain re num n break else if s i re n num break else if s i ...

簡單算術表示式求值

兩位正整數的簡單算術運算 只考慮整數運算 算術運算為 加法運算 減法運算 乘法運算 整除運算 取餘運算。算術表示式的格式為 運算子前後可能有空格 運算數 運算子 運算數請輸出相應的結果。一行算術表示式。整型算數運算的結果 結果值不一定為2位數,可能多於2位或少於2位 32 64 96 include...

算術表示式

引用標頭檔案 include include include using namespace std typedef int elemtype const int stack init size 100 儲存空間的初始化分配量 const int stackincrement 10 儲存空間分配增量...