贵州省住房和城乡建设官方网站,网址导航网站怎样做,dedecms建网站,软件培训学校哪家好本文实例为大家分享了C实现无括号的四则运算器的具体代码#xff0c;供大家参考#xff0c;具体内容如下完成度更高的带括号版本可以看C实现四则运算器(带括号)对于无括号的计算器#xff0c;实现起来比较容易#xff0c;下面让我们一步步实现。举例首先明确需要实现怎样的…本文实例为大家分享了C实现无括号的四则运算器的具体代码供大家参考具体内容如下完成度更高的带括号版本可以看C实现四则运算器(带括号)对于无括号的计算器实现起来比较容易下面让我们一步步实现。举例首先明确需要实现怎样的程序对于无括号的计算器大概做成这样就可以了5234*3-4/2分析对于例子中的表达式由于乘除运算的优先级高于加减运算我们不能直接从左到右进行。但四则运算的规则是从左到右先乘除后加减对于优先级相同的运算符还是可以从左到右运算的。 因此我们可以每读到一个运算符时检查前一个运算符的优先级如果前一个运算符的优先级与当前运算符相等或更高那么我们便可以完成前一个运算符的计算反之则不进行运算。这样一来就需要将之前的运算符以及运算符左右的数保存起来由于我们每次都是取前一个运算符符合后进先出的条件故可以选择栈来存储数据和符号。最好将数据和符号分开存储这里为了简便(整数栈即可存储数字也可存储字符)只实现整数的四则运算若需要浮点数的运算稍加修改即可。首先实现一个栈的类或者直接使用STL//Stack.h#ifndef STACK_H#define STACK_H#includeclass 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[capacity1]),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);elsereturn -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#includestack.h#includeusing 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;elsereturn 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;}/*12*315*4-34536/6*4145*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)))以上就是本文的全部内容希望对大家的学习有所帮助也希望大家多多支持脚本之家。