| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2120 人关注过本帖, 2 人收藏
标题:栈的表达式求值
只看楼主 加入收藏
outsider_scu
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:430
专家分:1333
注 册:2010-10-21
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

呵呵,我这个是C语言写的。。。。

编程的道路上何其孤独!
2010-10-27 12:52
sunmingchun
Rank: 4
来 自:安徽-滁州
等 级:业余侠客
帖 子:198
专家分:277
注 册:2010-4-2
收藏
得分:0 
回复 11楼 outsider_scu
那你帮代码发来给我看看呗!先谢谢了
2010-10-27 13:31
outsider_scu
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:430
专家分:1333
注 册:2010-10-21
收藏
得分:4 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include "linkstack.h"
#include "seqstack.h"
/*判断是否是数字*/
int IsNum(char c)
{
    if (c>='0'&&c<='9'||c=='.') return 1;
    else return 0;
}
/*简单运算函数*/
double cal(double a,double b,char t)
{
    switch(t)
      {
          case '+':return (a+b);
          case '-':return (a-b);
          case '*':return (a*b);
          case '/':return (a/b);
          default :printf("error!\n");
          return 0;
      }
}
         
/*运算符优先级*/
int priority(char op)
{
    switch(op)
    {
       
        case'\0':
        case'#': return 1;
        case')': return 2;
        case'+':
        case'-': return 3;
        case'*':
        case'/': return 4;
        case'(': return 5;
        default: printf("运算符错误\n");
                 return 0;
    }
}
/*数字字符串转换成实数*/
double StringToReal(char *s)
{
    double result;
    char dummy;

    if (s == NULL) printf("NULL string passed to StringToReal");
    sscanf(s, " %lg %c", &result, &dummy) ;
    return (result);
}
/*计算输入表达式的结果*/
int Calculate(char *s)
{
    double a,b,result;
    char c,w,t,f,*m;   
    PSeqStack A;   /*实数栈*/
    PLinkStack B;   /*字符栈*/
    A=Ini_SeqStack();
    B=Ini_LinkStack();
    m=s;
    Push_LinkStack(B,'#');
    w=*s;   /*把第一个字符送给w*/
    while(w!='\0'||(GetTop_LinkStack(B,&c),c)!='#')
    {
           if(IsNum(w))  
           {
              Push_SeqStack(A,StringToReal(s));
              while(IsNum(w))
              w=*(++s);
           }    /*如果是实数,进实数栈。*/
             else
             {
                   if(!priority(w)) { printf("输入错误\n"); system("pause"); return 0;}
                   if((GetTop_LinkStack(B,&c),c)=='('&&w==')')   /*如果栈顶是'('栈外也是')'则,脱括号*/
                   {
                        Pop_LinkStack(B,&f);
                        w=*(++s);
                   }
                   else if((GetTop_LinkStack(B,&c),c)=='('||priority((GetTop_LinkStack(B,&c),c))<priority(w)) 
                   {
                       Push_LinkStack(B,w);
                       w=*(++s);
                   }    /*如果 栈外运算符级别高,入运算符栈。*/
                   else
                   {
                        Pop_SeqStack(A,&b);
                        Pop_SeqStack(A,&a);
                        Pop_LinkStack(B,&t);
                        Push_SeqStack(A,cal(a,b,t));
                   }  /*如果栈内;运算符级别高,取出两个实数和一个操作符运算。*/
             }
    }
    Pop_SeqStack(A,&result);
    Destroy_SeqStack(&A);
    Destroy_LinkStack(&B);
    printf(">%s=%lf\n",m,result);
    return 1;
}
static void Help()
{
    printf("计算规则:\n");
    printf("输入正常的科学计算表达式。\n");
    printf("常用操作命令:\n");
    printf("Q——退出程序\n");
    printf("H——帮助信息\n");
    printf("R——清空屏幕\n");
    printf("可以使用的运算符:\n");
    printf("‘+’——加 \t‘-’——减\t‘*’——乘\n‘/’——除\t‘()’——小括号\n");
}
void main()
{
    char *s,ch;
    printf("科学计算器(帮助,按H键)\n");
    while(1)
    {
        printf(">");
        scanf("%s",s);
        ch=toupper(*s);
        switch(ch)
        {
            case 'Q': exit(0);
            case 'H': Help();break;
            case 'R': system("CLS"); break;
            default :Calculate(s);
           
        }
    }
}
一个是顺序栈,用来装实数;另一个是链表栈,用来装运算符。

编程的道路上何其孤独!
2010-10-27 16:07
sunmingchun
Rank: 4
来 自:安徽-滁州
等 级:业余侠客
帖 子:198
专家分:277
注 册:2010-4-2
收藏
得分:0 
回复 13楼 outsider_scu
头函数库发来啊!
2010-10-28 22:18
outsider_scu
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:430
专家分:1333
注 册:2010-10-21
收藏
得分:0 
没必要了吧。都是栈的基本操作,难道你连这个都写不出来?

编程的道路上何其孤独!
2010-10-28 23:15
kidangel666
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:93
专家分:139
注 册:2010-9-15
收藏
得分:0 
看你的头文件就知道你是用C++写的
2010-10-29 11:18
快速回复:栈的表达式求值
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.040030 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved