发表于 2011-4-27 07:53

申请会员ID:hdong [申请通过]

申请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;//存放表达式
int position=0;//表达式的位置
int sym=0;//运算符
int num1=0;//后操作数
int num2=0;//前操作数
int sum=0;//运算结果
    cout<<"请输入表达式:"<<endl;
    gets(expression);
while(expression!='\0' && expression!='\n')
{ if(is_symble(expression))//判断运算符
    {
if(expression=='(')
       symble=push(symble,expression,-1);
      else if(expression==')')
   {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) <= 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,-1);
   }
         symble=push(symble,expression,-1);
   }


    //把运算符放在栈里
else
   symble=push(symble,expression,-1);

}
   else if(!is_symble(expression))//把操作数放在栈里
                number=push(number,expression-48,expression-48);
   //cout<<expression<<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;

}

hnlsdht 发表于 2011-4-27 10:48

能有改过的动机是好事!同时也希望版主给他一次机会。

发表于 2011-4-27 13:54

不好意思,忘了填邮箱:1329825957@qq.com,麻烦斑竹审核通过,把邀请码发到我的邮箱,谢谢

Hmily 发表于 2011-4-27 14:42

ID:hdong
邮箱:1329825957@qq.com

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息

发表于 2011-4-27 21:20

谢谢斑竹,已经收到邀请码,前来报到。。。

Hmily 发表于 2011-4-28 00:23

报道需要登陆回复。

发表于 2011-4-28 07:48

可是我登陆后显示没有权限回复,这是怎么回事啊?

发表于 2011-4-28 08:46

申请ID:245087677
申请邮箱:245087677@qq.com
申请理由:本人精通木马,以前在网吧幽灵做木马后门版主,最近喜欢上了破解,不是很精通。
作品地址:http://home.126disk.com/245087677(还有几款DNF盗号教程,本人不玩木马了)
希望通过,真心学习。可和网幽做个链接。

hdong 发表于 2011-4-28 12:58

我来报道啦,弄了好久终于弄好了,嘿嘿{:1_924:}
页: [1]
查看完整版本: 申请会员ID:hdong [申请通过]