自己做的计算器,不过还没有界面化,大家有什么建议尽管提啊,希望共同进步
时间:2011-12-20
来源:互联网
#include <string>
#include <fstream>
#include <cstdlib>
using namespace std;
template <class T> // 链表节点 类
class Node
{
public:
Node() // default constructor
{
this->next = NULL;
}
Node(T data,Node<T> *next=NULL)
{
this->data = data;
this->next = next;
}
// 声明为public类型是便于top的访问
T data;
Node<T> *next; //next指向的对象是Node<T>,而不是T类型的
};
template <class T>
class LinkedStack
{
public:
LinkedStack(); //default constructor
~LinkedStack();
bool isEmpty();
void push(T x);
T pop();
T getTop();
private:
Node<T> *top;
};
template <class T>
LinkedStack<T>::LinkedStack()
{
top = NULL;
}
template <class T>
LinkedStack<T>::~LinkedStack()
{
Node<T> *p = top;
Node<T> *q;
while(p!=top) //将编表所分配的空间一个一个给释放掉
{
q = p;
p = p->next;
delete p;
}
top = NULL;
}
template <class T>
bool LinkedStack<T>::isEmpty()
{
return top == NULL;
}
template <class T>
void LinkedStack<T>::push(T x)
{
top = new Node<T>(x,top); // 将链表给链接起来,并且更新top指向的位置
}
template <class T>
T LinkedStack<T>::pop()
{
if(!isEmpty())
{
T x = top->data;
Node<T> *p = top;
top = top->next;
delete p;
return x;
}
throw "空栈,不能执行出栈操作";
}
template <class T>
T LinkedStack<T>::getTop()
{
if(!isEmpty())
{
return top->data;
}
throw "空栈,不能获得栈顶元素";
}
string tochange(string expression) //非递归后序遍历,将输入的计算表达式按后续遍历的顺序放到postfix中去 逆波兰式
{
LinkedStack<char> stack; // 模板用char实例化了
char postfix[100];
int i=0,j=0; char out;
while(expression[i]!='\0') //逆波兰式算法,将中序的算术表达式转化成为后续的式子
{
switch(expression[i])
{
case'+':
case'-':
while(!stack.isEmpty()&&stack.getTop()!='(')
{
postfix[j++] = stack.pop();
}
stack.push(expression[i++]);
break;
case'*':
case'/':
while(!stack.isEmpty()&&(stack.getTop()=='*'||stack.getTop()=='/'))
{
postfix[j++] = stack.pop();
}
stack.push(expression[i++]);
break;
case'(':stack.push(expression[i++]);
break;
case')':out = stack.pop();
while(!stack.isEmpty()&&out!='(')
{
postfix[j++] = out;
out = stack.pop();
}
i++;
break;
default:
while(expression[i]>='0'&&expression[i]<='9')
{
postfix[j++] =expression[i++];
}
}
}
while(!stack.isEmpty())
{
postfix[j++]=stack.pop();
}
postfix[j]='\0'; //将postfix数组最后补上\0,表示结尾
return postfix;
}
int value(string postfix) //计算
{
LinkedStack<int> stack; //模板用int实例化了,用于存放int型数据
int i=0;
int result = 0;
while(postfix[i]!='\0')
{
if(postfix[i]>='0'&&postfix[i]<='9')
{
result = 0;
result = result*10+postfix[i++]-'0';
stack.push(result);
}
else
{
int y = stack.pop();
int x = stack.pop();
switch(postfix[i])
{
case'+':result = x + y;
break;
case'-':result = x - y;
break;
case'*':result = x * y;
break;
case'/':result = x / y;
break;
}
stack.push(result);
i++;
}
}
return stack.pop();
}
int main()
{
cout<<"******************计算器******************"<<endl;
cout<<" (By Lby)"<<endl;
cout<<endl<<endl;
cout<<"请选择您想要执行的操作: 1. 从键盘输入 2. 从文件读取"<<endl;
int t;
cin>>t;
switch(t)
{
case 1:
string a;
getline(cin,a);
getchar();
string postfix = tochange(a);
cout<<a<<"=";
cout<<value(postfix)<<endl;
break;
case 2:
ifstream in;
ofstream out;
in.open("math.in");
out.open("result.out");
if(!in)
{
cerr<<"Fail to open the file,please check!!!"<<endl;
exit(0);
}
int i=0; int m=0;
string expression[100];
while(getline(in,expression[i++]));
m=i-1;
for(i=0;i<m;i++)
{
string postfix = tochange(expression[i]);
out<<expression[i]<<"=" ;
out<<value(postfix)<<endl;
}
in.close();
out.close();
}
return 0;
}
大家对程序有什么好的改进的地方,尽管提啊,自己第一次做的东西,是计算器,不过还没有界面化,各位大侠,有什么好的建议尽管提啊 ,不要吝啬,希望大家共同进步。。。
作者: liboyang66666 发布时间: 2011-12-20
作者: cbzjzsb123 发布时间: 2011-12-20
重新排一下版吧,看的够累的。
作者: mosaic 发布时间: 2011-12-20
作者: gaochizhen33 发布时间: 2011-12-20
作者: bobye1230 发布时间: 2011-12-20
作者: yisikaipu 发布时间: 2011-12-20
作者: wadeyz 发布时间: 2011-12-20
用MFC做界面
作者: liboyang66666 发布时间: 2011-12-21
code=C/C++ 代码要粘贴到这个中间 /code
作者: liboyang66666 发布时间: 2011-12-21
控制台界面编程,这有本书非常适合你。。。
http://download.csdn.net/detail/wadeyz/3405252
作者: liboyang66666 发布时间: 2011-12-21
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28