问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用C++语言实现大整数型计算器

发布网友 发布时间:2022-06-04 15:51

我来回答

1个回答

热心网友 时间:2023-10-29 13:30

#include "stdafx.h"
#include "iostream.h"
#include "math.h"
#include "time.h"
#define TRUE 1
#define FALSE 0
#define ERROR -1
typedef int Status;
//用模板实现的链式结构堆栈类
template <class T>
class stack{
private:
struct link{
T data; //结点数据域
link *next; //下一结点指针
link(T Data,link* Next){//结构体构造函数
data=Data;
next=Next;
}
}*head; //堆栈顶指针
public:
stack(); //构造函数(初始化栈)
~stack(); //析构函数(销毁栈)
void push(T Data); //压栈操作
T gettop()const; //取栈顶元素
T pop(); //出栈操作
T getvalue(int index); //返回栈底开始第INDEX个栈中值
void traverse(int n); //遍历栈 N个数换行
int empty(); //判断栈是否为空,1是,0非
int sizeofstack(); //返回栈的大小
void clear(); //清空栈
};
//类模板成员函数的实现
template<class T> stack<T>::stack()//构造函数
{
head=0;
}
template<class T> stack<T>::~stack()//析构函数
{
link* cursor=head;
while(head)
{
cursor=cursor->next;
delete head;
head=cursor;
}
}
template<class T>void stack<T>::push(T Data)//压栈操作
{
head=new link(Data,head);
}
template<class T>T stack<T>::gettop()const//取栈顶元素
{
return head->data;
}
template<class T>T stack<T>::pop()//出栈操作
{
if(head==0)return 0;
T result=head->data;
link* oldhead=head;
head=head->next;
delete oldhead;
return result;
}
template <class T>T stack<T>::getvalue(int index)//返回栈底开始第INDEX个栈中值
{
link *cursor=head;
int i=1;
int stacklen=sizeofstack();
if(index<=0||index>stacklen)return 0;
while(i<=(stacklen-index))
{
cursor=cursor->next;
i++;
}
return cursor->data;
}
template <class T> void stack<T>::traverse(int n)//遍历栈
{
link * cursor=head;
int iEnterSign=1;//换行标识
while(cursor)
{
cout<<cursor->data<<" ";
if(iEnterSign%n==0)cout<<endl;
cursor=cursor->next;
iEnterSign++;
}
if((iEnterSign-1)%n!=0)cout<<endl;
}
template <class T>int stack<T>::empty() //判断栈是否为空,1是,0非
{
return head==0?1:0;
}
template <class T>int stack<T>::sizeofstack() //返回栈的大小
{
int size=0;
link *cursor=head;
while(cursor)
{
cursor=cursor->next;
size++;
}
return size;
}
template<class T> void stack<T>:: clear() //清空栈
{
link *cursor=head;
while(cursor&&cursor->next)
{
cursor=cursor->next;
delete head;
head=cursor;
}
}
int Operator(char ch)
{
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#')
return(TRUE);
else
return(FALSE);
}
char Precede(char ch1,char ch2)
{
char ch;
switch(ch1)
{
case '+':
case '-':
{
switch(ch2)
{
case '+':
case '-':
case ')':
case '#':
ch='>';break;
case '*':
case '/':
case '(':
ch='<';break;
}
break;
}
case '*':
case '/':
{
if(ch2=='(')
ch='<';
else
ch='>';
break;
}
case '(':
{
if(ch2==')')
ch='=';
else
ch='<';
break;
}
case ')':
{
ch='>';
break;
}
case '#':
{
if(ch2=='#')
ch='=';
else
ch='<';
break;
}
}
return(ch);
}
int calc(int x,char ch,int y)
{
int z;
switch(ch)
{
case '+': z=x+y; break;
case '-': z=x-y; break;
case '*': z=x*y; break;
case '/': z=x/y; break;
}
return(z);
}
int postexpression(char *exp)
{
stack<int> *opnd=new(stack<int>);
char ch=*exp;
int x=0,y,z,flag=FALSE;
int result;
while(ch!='#')
{
if(!Operator(ch))
{
if(ch!=' ')
{
x=x*10+(int)(ch)-48;
flag=TRUE;
}
else
{
if(flag)opnd->push(x);
x=0;
flag=FALSE;
}
}
else
{
x=opnd->pop();
y=opnd->pop();
z=calc(y,ch,x);
opnd->push(z);
}
ch=*(++exp);
}
result=opnd->pop();
return(result);
}
int middexpression(char *exp)
{
stack<int> *opnd=new(stack<int>);
stack<char> *optr=new(stack<char>);
char ch=*exp;
int x=0,y,z;
int result;
optr->push('#');
while(ch!='#'||optr->gettop()!='#')
{
if(!Operator(ch))
{

x=x*10+(int)(ch)-48;
if(Operator(*(exp+1)))
{
opnd->push(x);
x=0;
}
ch=*++exp;
}
else
{
switch(Precede(optr->gettop(),ch))
{
case '<'://栈顶元素优先权低
optr->push(ch);
ch=*++exp;
break;
case '='://脱括号并接收下一字符
optr->pop();
ch=*++exp;
break;
case '>'://退栈并将运算结果入栈
x=opnd->pop();
y=opnd->pop();
z=calc(y,optr->pop(),x);
opnd->push(z);
x=0;
break;
}
}
}
result=opnd->pop();
return(result);
}
void main(void)//程序入口函数
{
clock_t t1,t2,t3,t4;
int i,n=9000;
t1=clock();
for(i=0;i<n;i++)
postexpression("100 200 50 3 * - 13 8 - / +#");
//postexpression("100 200 50 8 45 9 / - - + #");
//postexpression("9 6 * 3 / 7 + 13 -#");
t2=clock();
printf("%10f\n",(t2-t1)/18.2/n);

t3=clock();
for(i=0;i<n;i++)
middexpression("100+(200-50*3)/(13-8)#");
//middexpression("100+(200-(50*(8-45/9)))#");
//middexpression("9*6/3+7-13#");
t4=clock();
printf("%10f\n",(t4-t3)/18.2/n);

printf("%10f",(t4-t3)/18.2/(t2-t1)*18.2);
cin.get();

参考资料:http://zhidao.baidu.com/question/14988945.html

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
大连市有几个嘉汇学校 平躺睡觉胸口有压迫感怎么回事 ...手机推荐!除了小米,外形大气好看,请各位大侠推荐,不胜感激!明天就要... 各位大侠们小人想买2000以下的手机(超出一点没关系)主要是玩游戏,别跟... 各位大侠推荐一部洛机亚手机,要支持GPS,是全触屏手机,价格在2000... ...手机,电池耐用的,速度可以的,请各位大侠推荐一款呗!最好是安卓系统... 想要买一部两千到三千的智能手机,希望各位大侠推荐一下 天干地支六十甲子六十甲子 60甲子有多少个组合 买什么实物金 如何使用VB6进行超大数值计算 c语言中如何输出9874532129876543210987654,就是计算出一个超大超大的数,该如何输出呢 有谁能提供一个可以做超大数字运算的的计算器软件? 为什么不能修改 为什么现在不能修改,不是说可以修改一次吗 我的怎么改不了 为什么不可以修改? 微信可以登录但不能改 为什么不能修改了? 为什么不可以改 我的不能修改是什么原因? 为什么不能修改 怎么不能修改 为什么不能改 为什么我现在的不能修改怎么办 怎么也改不了怎么办 为什么我的点不开,想改改不了呢? 为什么我的改不了 为什么我的不能修改 怎么也改不了? 用七颗珠子在计算器上播出三位数,最大数和最小数的差是多少? 鸡的反义词是什么 ‘鸡’的反义词是什么? 鸡的反义词是什么请你指教 小鸡的′反义词是什么? 鸡和鸭是反义词吗 小鸡的反义词是什么,除了大鸡还有什么 小鸡的反义词是什么 呆苦木鸡的反义词 为什么小肚鸡肠滴反义词不是大肚牛肠呢? 为什么鸡和狗不是反义词 公鸡的反义词是什么 鸡什么成什么用反义词来补充词语 呆若木鸡的反义词 呆若木鸡的反义词是什么 鸡叫的反义词是什么 呆若木鸡的反义词? 佛仙神鬼相诀,从面相看哪些人容易成佛,成神仙或成鬼 《佛仙神魔》txt下载在线阅读全文,求百度网盘云资源 供俸佛道仙神像位置怎么排列