|
吾爱游客
发表于 2011-4-27 07:53
申请id:hdong
内容:信息安全专业在学学生,会一些简单c语言,汇编,asp,希望加入
作品:
平时时间不多,最近数据结构的作业,不知道行不行:用堆栈实现的一个简单的计算器
中缀表达式求值:
#include<stdio.h>
#include<malloc.h>
#include<iostream.h>
struct node
{
int date;
struct node *next;
};
typedef struct node *link;
link number=NULL;
link symble=NULL;
//把数据放入栈中//
link push(link stack ,int num,int k)
{ link newnode;
newnode=(link)malloc(sizeof(struct node));
if(newnode==NULL)
cout<<"out of space"<<endl;
else
{ if(k>=0 && k<=9)//判断前一个字符是否为数字
{
stack->date=stack->date*10+num;
return stack;
}
else
{
newnode->date=num;
newnode->next=stack;
stack=newnode;
return stack;
}
}
}
//从栈上取出数据//
link pull(link stack,int *num)
{
link top;//去栈顶元素
if(stack!=NULL)
{
top=stack;
stack=stack->next;
*num=top->date;
free(top);
return stack;
}
else
*num=0;
}
//判断栈是否为空
int empty(link stack)
{
if(stack==NULL)
return 1;
else
return 0;
}
//判断是否为运算符
int is_symble(char ch)
{
switch(ch)
{ case '(':
case ')':
case '+':
case '-':
case '*':
case '/':
return 1;
default:
return 0;
}
}
// 判断运算符的优先级
int priority(char ch)
{
switch(ch)
{ case '(':
return 1;
case '+':
case '-':return 2;
case '*':
case '/': return 3;//'+','-'的优先级小于'*','/'
default:return 0;
}
}
//计算两个操作数的值
int tuo_result(int m,int num1,int num2 )
{ switch(m)
{ case '+':
return(num2 + num1);
case '-':
return (num2-num1);
case '*':
return(num2 * num1);
case '/':
return(num2 / num1);
}
}
//主函数
void main ()
{
char expression[50];//存放表达式
int position=0;//表达式的位置
int sym=0;//运算符
int num1=0;//后操作数
int num2=0;//前操作数
int sum=0;//运算结果
cout<<"请输入表达式:"<<endl;
gets(expression);
while(expression[position]!='\0' && expression[position]!='\n')
{ if(is_symble(expression[position]))//判断运算符
{
if(expression[position]=='(')
symble=push(symble,expression[position],-1);
else if(expression[position]==')')
{ while(symble->date!='(')
{ number=pull(number,&num1);
number=pull(number,&num2);
symble=pull(symble,&sym);
number=push(number,tuo_result(sym,num1,num2),-1);
}
//if(symble->date='(')symble=pull(symble,&sym);
symble=pull(symble,&sym);
}
else if(!empty(symble))//判断放运算符的栈是否为空
{ if(priority(expression[position]) <= priority(symble->date) &&
!empty(symble))
{
//取出一个运算符和两个操作数
number=pull(number,&num1);
number=pull(number,&num2);
symble=pull(symble,&sym);
number=push(number,tuo_result(sym,num1,num2),-1);
//cout<<tuo_result(sym,num1,num2)<<endl;
//把运算符放在栈里
//symble=push(symble,expression[position],-1);
}
symble=push(symble,expression[position],-1);
}
//把运算符放在栈里
else
symble=push(symble,expression[position],-1);
}
else if(!is_symble(expression[position]))//把操作数放在栈里
number=push(number,expression[position]-48,expression[position-1]-48);
//cout<<expression[position]<<endl;
position++;
}
//取出运算符栈的运算符
while(!empty(symble))
{ //cout<<symble->date<<endl;
symble=pull(symble,&sym);
if(!empty(symble))//判断是否为空
{
if(sym=='+' && symble->date=='-' )//判断符号问题 ,2-2*3+5=1不然就是-1
sym='-';
}
number=pull(number,&num1);
number=pull(number,&num2);
//cout<<num1<<" "<<num2<<endl;
//计算的结果放在栈中
number=push(number, tuo_result(sym,num1,num2),-1);
//cout<<number->date<<endl;
}
//取出运算结果
number=pull(number,&sum);
cout<<expression<<"="<<sum<<endl;
}
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|