关键思想是运算符的优先级设置,分别使用一个数字栈和一个运算符栈,等到运算符栈为空,运算结束了。
compute.cpp
// compute.cpp : Defines the entry point for the console application. // #include<iostream> using namespace std; #include"StdAfx.h" #include"Stack.h" //先实现一个3+4# //判断符号优先级 char Priority(char ch1,char ch2); //传入出栈的2个数字和一个运算符并且计算该二元运算。比如3+5、8*9 int Compute(int a,int b,char sign); int main(){ Stack<int> number;//数字栈 Stack<char> character;//运算符栈 character.Push('#'); int ch = getchar(); //它从标准输入里读取下一个字符。返回类型为int型,返回值为用户输入的ASCⅡ码,出错返回-1,比如输入a ,返回97,输入3,返回51 char b; b=static_cast<char>(ch);//b是ch转换的字符 while(b!='#' || character.getTop()!='#'){ if(ch>48 && ch<=57){//这里非常容易写错啊!不是ch>0 && ch<=9,或者b>0 && b<=9; number.Push(ch-48); ch = getchar(); b=static_cast<char>(ch); } else{ switch( Priority( character.getTop(), b)){ case'<'://栈顶元素优先级低 character.Push(b); ch = getchar(); b=static_cast<char>(ch); break; case'='://脱一个'('括号 并且接收下一个字符 character.Pop(); ch = getchar(); b=static_cast<char>(ch); break; case'>'://出栈并且把运算结果入栈 number.Push(Compute(number.Pop(),number.Pop(),character.Pop())); /*int result=number.Pop()+number.Pop(); cout<<result; number.Push(result);*/ break; } } } // cout<<"运算结果是"<<" "<<number.getTop()<<'\n'; printf("运算结果是 %d \n",number.getTop()); return 0; } char Priority(char ch1,char ch2){ int a; int b; switch(ch1){ case '#' : a=0; break; case '(' : a= 1; break; case '+' : a= 3; break; case '-' : a= 3; break; case '*' : a= 5; break; case '/' : a= 5; break; case '%' : a= 5; break; case '^' : a= 7; break; case ')' : a= 8; break; } switch(ch2){ case '#' : b=0; break; case '(' : b= 8; break; case '+' : b= 2; break; case '-' : b= 2; break; case '*' : b= 4; break; case '/' : b= 4; break; case '%': b= 4; break; case '^' : b= 6; break; case ')' : b= 1; break; } if(a<b) return '<'; else if(a==b) return '='; else return '>'; } //传入出栈的2个数字和一个运算符并且计算该二元运算。比如3+5、8*9 int Compute(int a,int b,char sign){ int result; switch(sign){ case '+' : result=a+b; break; case '-' : result=a-b; break; case '*' : result=a*b; break; case '/' : result=a/b; break; case '%' : result=a%b; break; case '^' : result=a^b; break; } return result; } /** */
Stack.h
//...................................................................................节点类 #ifndef STACK_H #define STACK_H template<typename T> class Node{ public: T element; Node *next; //构造函数 Node(T element){ this->element = element; next = NULL; } }; //..................................................................................栈类 template<typename T> class Stack{ private: Node<T> *top; int size; public: //构造函数 Stack(){ //头结点赋值为0; Node<T> *newNode = new Node<T>(0); top = newNode; size = 0;//无需因为头结点把size 初始化为1; } //返回栈的长度 int stackLength(){ return size; } //判栈为空 bool stackEmpty(){ if(0==size) return true; else return false; } //入栈 void Push(T e){ Node<T> *newNode = new Node<T>(e); newNode->next = top->next; top->next = newNode; size++; } //出栈 T Pop(){ Node<T> *current = top->next; top->next = current->next; T f=current->element; delete current; size--; return f; } //返回栈顶元素 T getTop(){ return top->next->element; } }; #endif
相关推荐
- **计算器应用**:实现基本的数学运算功能。 - **文本编辑器**:支持基本的文本处理功能。 通过这些基础知识和资源介绍,希望可以帮助您更好地了解C++语言及其学习路径。C++作为一种强大的编程语言,掌握它不仅...
6.4 用struct实现用户自定义类型Time 6.5 用类实现Time抽象数据类型 6.6 类范围与访问类成员 6.7 接口与实现方法的分离 6.8 控制对成员的访问 6.9 访问函数与工具函数 6.10 初始化类对象:构造函数 6.11 在...
6.4 用struct实现用户自定义类型Time 6.5 用类实现Time抽象数据类型 6.6 类范围与访问类成员 6.7 接口与实现方法的分离 6.8 控制对成员的访问 6.9 访问函数与工具函数 6.10 初始化类对象:构造函数 6.11 在...
- **内存区域划分**:堆(heap)与栈(stack)的区别与联系。 - **动态内存分配**:malloc、calloc、realloc、free等函数的使用方法及注意事项。 - **内存泄漏检测**:工具与方法介绍,如何有效避免内存泄漏问题。 ####...
- **算术运算符**:支持基本的数学运算。 - **关系运算符**:用于比较操作,如 `、`>` 等。 - **逻辑运算符**:`&&`、`||` 和 `!`。 - **按位运算符**:`&`、`|`、`^`、`和 `>>`。 - **赋值运算符**:`=`, `+=`, `-=...
此外,Python的列表(list)、元组(tuple)、集合(set)和字典(dict)等复合数据结构为解决复杂问题提供了便利。 在算法和数据结构方面,Python提供了内置的排序函数(sorted())和各种容器操作,如列表推导式、...