最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)四則運算器(無括號)

 更新時間:2020年11月25日 14:22:45   作者:shadowgully  
這篇文章主要為大家詳細介紹了C++實現(xiàn)四則運算器,無括號的計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

完成度更高的帶括號版本可以看C++實現(xiàn)四則運算器(帶括號)
對于無括號的計算器,實現(xiàn)起來比較容易,下面讓我們一步步實現(xiàn)。

舉例

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

52+34*3-4/2=

分析

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

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

首先,實現(xiàn)一個棧的類,或者直接使用STL

//Stack.h
#ifndef STACK_H
#define STACK_H
#include<iostream>
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)<capacity)
 {
 *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

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

//Main.cpp
#include"stack.h"
#include<iostream>
using namespace std;
bool is_digit(char i)
{//是數(shù)字
 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)
{//獲取兩個符號間的優(yōu)先級,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;//數(shù)據(jù)棧
 stack_int ope_stack;//符號棧
 char current_char;
 current_char = getchar();
 bool overflag = false;
 while (overflag!=true)
 {//未遇到=號時不斷進行四則運算
 if (is_digit(current_char))
 {//遇到數(shù)字符號則將完整的數(shù)解析出來并保存于棧中
 int num = 0;
 num = current_char - '0';//符號轉數(shù)字
 current_char = getchar();//獲取下一個字符
 while (is_digit(current_char))
 {
 num = num * 10+(current_char-'0');
 current_char = getchar();
 }
 num_stack.push(num);
 //cout <<"the number is " <<num << endl;
 }
 if (current_char == ' ')
 {//空格則繼續(xù)
 current_char = getchar();
 continue;
 }
 if (is_operator(current_char))
 {//遇到運算符則將運算符保存于運算符棧中
 int ope = '?';
 //如果當前符號棧非空,則不斷根據(jù)優(yōu)先級決定是否進行一次運算
 while((!ope_stack.isEmpty())&&(get_priority((char)ope_stack.gettop(),current_char)))
 {//如果前一個運算符優(yōu)先級更高
 ope_stack.pop(ope);
 //cout << "找到了前一個運算符為: " << (char)ope << endl;
 int lnum, rnum;
 //符號棧非空時,數(shù)據(jù)棧應該至少有兩個數(shù),否則出錯
 if (num_stack.isEmpty())
 {
  cout << "數(shù)據(jù)棧缺失兩個元素,解析失敗!" << endl;
  overflag = true;
  break;
 }
 num_stack.pop(rnum);
 if (num_stack.isEmpty())
 {
  cout << "數(shù)據(jù)棧缺失一個元素,解析失敗!" << 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;
}

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

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

if (is_operator(current_char))

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

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

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

相關文章

  • Qt編寫自定義控件實現(xiàn)抽獎轉盤

    Qt編寫自定義控件實現(xiàn)抽獎轉盤

    這篇文章主要為大家詳細介紹了Qt編寫自定義控件實現(xiàn)抽獎轉盤,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • VC++文件監(jiān)控之FindFirstChangeNotification

    VC++文件監(jiān)控之FindFirstChangeNotification

    因為ReadDirectoryChangesW 上次測試發(fā)現(xiàn)不能多級目錄監(jiān)控,所以嘗試用FindFirstChangeNotification來實施文件監(jiān)控,需要的朋友可以參考下
    2019-04-04
  • 詳解OpenMP的線程同步機制

    詳解OpenMP的線程同步機制

    在本篇文章當中主要給大家介紹?OpenMP?當中線程的同步和互斥機制,在?OpenMP?當中主要有三種不同的線程之間的互斥方式。下面就來和大家來討論一下OpenMP當中的互斥操作,需要的可以參考一下
    2023-01-01
  • 詳解C++編程中標記語句與復合語句的寫法

    詳解C++編程中標記語句與復合語句的寫法

    這篇文章主要介紹了C++編程中標記語句與復合語句的寫法,是C++入門學習中的基礎知識,需要的朋友可以參考下
    2016-01-01
  • C語言實現(xiàn)簡易掃雷小游戲

    C語言實現(xiàn)簡易掃雷小游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡易掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C語言實現(xiàn)“幸運數(shù)”的實例詳解

    C語言實現(xiàn)“幸運數(shù)”的實例詳解

    這篇文章主要介紹了C語言實現(xiàn)“幸運數(shù)”的實例詳解的相關資料,需要的朋友可以參考下
    2017-07-07
  • C++分析講解類的靜態(tài)成員函數(shù)如何使用

    C++分析講解類的靜態(tài)成員函數(shù)如何使用

    與靜態(tài)數(shù)據(jù)成員不同,靜態(tài)成員函數(shù)的作用不是為了對象之間的溝通,而是為了能處理靜態(tài)數(shù)據(jù)成員,靜態(tài)成員函數(shù)沒有this指針。既然它沒有指向某一對象,也就無法對一個對象中的非靜態(tài)成員進行默認訪問
    2022-04-04
  • Visual Studio C++指針靠前靠后的問題全面解析

    Visual Studio C++指針靠前靠后的問題全面解析

    這篇文章主要介紹了Visual Studio C++指針靠前靠后的問題全面解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • C語言 鏈式二叉樹結構詳解原理

    C語言 鏈式二叉樹結構詳解原理

    二叉樹的鏈式存儲結構是指,用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關系。通常的方法是鏈表中每個結點由三個域組成,數(shù)據(jù)域和左右指針域,左右指針分別用來給出該結點左孩子和右孩子所在的鏈結點的存儲地址
    2021-11-11
  • C語言之直接插入排序算法的方法

    C語言之直接插入排序算法的方法

    這篇文章主要為大家介紹了C語言直接插入排序算法的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12

最新評論

广饶县| 宿迁市| 千阳县| 延安市| 集安市| 云安县| 百色市| 石景山区| 阳西县| 栾川县| 福建省| 新竹县| 博兴县| 陵水| 剑河县| 昭通市| 天柱县| 玛纳斯县| 白山市| 伊通| 巴林右旗| 桓仁| 常州市| 乃东县| 绵竹市| 巢湖市| 乡宁县| 轮台县| 辽宁省| 灵寿县| 张掖市| 长垣县| 鄂托克前旗| 浦江县| 鄢陵县| 韩城市| 出国| 绍兴县| 大足县| 马龙县| 晋中市|