日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c 语言开发一个四则运算器,C++实现四则运算器(无括号)

發布時間:2025/3/11 c/c++ 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c 语言开发一个四则运算器,C++实现四则运算器(无括号) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文實例為大家分享了C++實現無括號的四則運算器的具體代碼,供大家參考,具體內容如下

完成度更高的帶括號版本可以看C++實現四則運算器(帶括號)

對于無括號的計算器,實現起來比較容易,下面讓我們一步步實現。

舉例

首先明確需要實現怎樣的程序,對于無括號的計算器,大概做成這樣就可以了:

52+34*3-4/2=

分析

對于例子中的表達式,由于乘除運算的優先級高于加減運算,我們不能直接從左到右進行。但四則運算的規則是從左到右,先乘除后加減,對于優先級相同的運算符還是可以從左到右運算的。

? 因此我們可以每讀到一個運算符時,檢查前一個運算符的優先級,如果前一個運算符的優先級與當前運算符相等或更高,那么我們便可以完成前一個運算符的計算;反之,則不進行運算。這樣一來就需要將之前的運算符以及運算符左右的數保存起來,由于我們每次都是取前一個運算符,符合后進先出的條件,故可以選擇棧來存儲數據和符號。最好將數據和符號分開存儲,這里為了簡便(整數棧即可存儲數字也可存儲字符),只實現整數的四則運算,若需要浮點數的運算,稍加修改即可。

首先,實現一個棧的類,或者直接使用STL

//Stack.h

#ifndef STACK_H

#define STACK_H

#include

class stack_int

{

private:

int* bottom; //棧底

int* top; //棧頂

unsigned int capacity;//棧容量

unsigned int size; //棧大小

public:

stack_int() :bottom(new int[11]), top(bottom), capacity(10), size(0) {};

stack_int(unsigned int capacity) :bottom(new int[capacity+1]),top(bottom), capacity(capacity),size(0){};

int operator[](unsigned int i) const

{

return *(bottom + i);

}

bool isEmpty()const { return bottom == top; }

bool isFull()const { return size == capacity-1; }

unsigned int getsize()const { return size; }

unsigned int getcapacity()const { return capacity; }

int gettop()const

{

if (!isEmpty())

return *(top - 1);

else

return -1;

}

void settop(int i)

{

if (!isEmpty())

{

*(top - 1) = i;

}

}

void push(int i)

{

if ((top - bottom)

{

*top = i;

top++;

size++;

}

else

{

std::cout << "stack full!" << std::endl;

stack_expansion();

push(i);

}

}

int pop(int &val)

{//返回值為1則棧未空,返回值為0則棧已空無法出棧

if (top > bottom)

{

top--;

size--;

val = *top;

return 1;

}

else

{

std::cout << "stack empty!" << std::endl;

return NULL;

}

}

private:

void stack_expansion()

{//棧擴容

std::cout << "正在擴容中..." << std::endl;

int newcapacity = 2 * capacity + 1;

int* newbottom = new int[newcapacity + 1];

int* newtop = newbottom;

for (int i = 0; i < size; ++i)

{

*newtop = *bottom;

newtop++;

bottom++;

}

bottom = newbottom;

top = newtop;

capacity = newcapacity;

}

};

#endif

然后在我們的主程序中利用棧來分析四則運算的規律(源代碼如下)

//Main.cpp

#include"stack.h"

#include

using namespace std;

bool is_digit(char i)

{//是數字

if (i == '1' || i == '2' || i == '3' || i == '4' || i == '5' || i == '6' || i == '7' || i == '8' || i == '9' || i == '0')

return true;

else return false;

}

bool is_operator(char i)

{//是運算符

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

return true;

else return false;

}

bool get_priority(char pre,char cur)

{//獲取兩個符號間的優先級,pre為靠前的字符,cur為靠后的字符

if ((pre == '+' || pre == '-') && (cur == '*' || cur == '/'))

return false;

else

return true;

}

int do_operation(int lnum, char ope, int rnum)

{

if (ope == '+')

return lnum + rnum;

if (ope == '-')

return lnum - rnum;

if (ope == '*')

return lnum * rnum;

if (ope == '/')

return lnum / rnum;

}

/*

1+2*3=

1+5*4-345+36/6*4+145*4*5-52=

*/

int main()

{

stack_int s;

stack_int num_stack;//數據棧

stack_int ope_stack;//符號棧

char current_char;

current_char = getchar();

bool overflag = false;

while (overflag!=true)

{//未遇到=號時不斷進行四則運算

if (is_digit(current_char))

{//遇到數字符號則將完整的數解析出來并保存于棧中

int num = 0;

num = current_char - '0';//符號轉數字

current_char = getchar();//獲取下一個字符

while (is_digit(current_char))

{

num = num * 10+(current_char-'0');

current_char = getchar();

}

num_stack.push(num);

//cout <

}

if (current_char == ' ')

{//空格則繼續

current_char = getchar();

continue;

}

if (is_operator(current_char))

{//遇到運算符則將運算符保存于運算符棧中

int ope = '?';

//如果當前符號棧非空,則不斷根據優先級決定是否進行一次運算

while((!ope_stack.isEmpty())&&(get_priority((char)ope_stack.gettop(),current_char)))

{//如果前一個運算符優先級更高

ope_stack.pop(ope);

//cout << "找到了前一個運算符為: " << (char)ope << endl;

int lnum, rnum;

//符號棧非空時,數據棧應該至少有兩個數,否則出錯

if (num_stack.isEmpty())

{

cout << "數據棧缺失兩個元素,解析失敗!" << endl;

overflag = true;

break;

}

num_stack.pop(rnum);

if (num_stack.isEmpty())

{

cout << "數據棧缺失一個元素,解析失敗!" << endl;

overflag = true;

break;

}

num_stack.pop(lnum);

lnum = do_operation(lnum, (char)ope, rnum);//進行運算

num_stack.push(lnum);

}

if (current_char == '=')

{//如果解析到=號了,解析完成

overflag = true;

break;

}

ope_stack.push(current_char);

current_char = getchar();

}

}

for (int i = 0; i < num_stack.getsize(); ++i)

cout << num_stack[i] << "\t";

cout << endl;

for (int i = 0; i < ope_stack.getsize(); ++i)

cout << (char)ope_stack[i] << "\t";

return 0;

}

這里需要注意一些問題,首先,由于整數可能是多位數,因此在遇到一個數字符號時,我們可以通過循環將后面幾位全部找出,并將符號轉化為真正的數值。

第二個問題就是有時候會出現表達式解析到等號了,卻有很多數沒進行運算,解決這個問題的方法就是在

if (is_operator(current_char))

中使用while循環,并將循環條件設置為棧非空且棧頂運算符優先級高于當前讀入的運算符(前提是=的優先級小于任何運算符)

while((!ope_stack.isEmpty())&&(get_priority((char)ope_stack.gettop(),current_char)))

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

總結

以上是生活随笔為你收集整理的c 语言开发一个四则运算器,C++实现四则运算器(无括号)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。