| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1469 人关注过本帖
标题:向大神求助:为什么在输入7-2*3时会出现stack underflow,该如何更改?
只看楼主 加入收藏
紫诺
Rank: 1
来 自:中国
等 级:新手上路
帖 子:8
专家分:0
注 册:2019-11-3
结帖率:0
收藏
已结贴  问题点数:20 回复次数:7 
向大神求助:为什么在输入7-2*3时会出现stack underflow,该如何更改?
# define StackSize 100
#include<stdlib.h>
#include<string.h>
#include <stdio.h>
typedef  int datatype;
typedef struct {
              datatype  data[StackSize];
              int top;
    } seqstack;
void initstack(seqstack *s)
{
      s->top=0;
}
int stackempty(seqstack *s)
{
return(s->top==0);
}
int stackfull(seqstack   *s)
{
      return(s->top==StackSize);
}
void  push(seqstack  *s,datatype  x)
{   if (stackfull(s))
        {  printf("stack overflow!!");
           exit(1);
        }
         s->data[s->top++]=x;
}
void pop(seqstack *s,datatype *e)
{   if(stackempty(s))
     { printf("stack underflow!");
       exit(1);
     }
      s->top--;
      *e=s->data[s->top];
}
datatype  gettop(seqstack  *s)
{
       if(stackempty(s))
    {    printf("stack is enpty!");
         exit(0);
    }
    return (s->data[s->top-1]);
}

char op[]="+-*/()#";
int in(char c,char *op)
{  if(strchr(op,c))
      return(1);
   else
      return(0);
}
int priority(char c)
{  /*将运算符转换成优先级,设置优先级用整型数表示:'#'其优先级为0;
'('其优先级为1;'+、-'其优先级为2
  '*、/'其优先级为3;')'其优先级为4*/
   switch(c)
   {  case '#':return(0);
      case '(':return(1);
      case '+':
      case '-': return(2);
      case '*':
      case '/': return(3);
      case ')': return(4);
    }
}
char precede(char c1,char c2)
{ /*pri1,pri2为栈顶运算符和当前运算符的优先级,比较2个运算符的优先级大小,
若pri1=1且pri2=4,返回=;
若pri1=0且pri2=0,返回=;若pri2=1,返回<;若pri2=4,返回>;若pri1>=pri2,返回>;
若pri1<pri2,返回<*/
  int pri1,pri2;
  pri1=priority(c1);
  pri2=priority(c2);
  if (pri1==1&&pri2==4) return('=');
  if (pri1==0&&pri2==0) return('=');
  if (pri2==1) return('<');
  if (pri2==4) return('>');
  if (pri1>=pri2) return('>');
  if (pri1<pri2) return('<');
  return('0');
}

int operate(int a,char theta,int b)
{/*计算a theta b 返回计算结果。注:theta为运算符*/
  switch(theta)
  {  case '+': return(a+b);
     case '-':return(a-b);
     case '*':return(a*b);
     case '/':return(a/b);
  }
}
char change(int c)
{/*将运算符栈弹出的内容转换成相应的运算符*/
  switch(c)
  {  case 35: return('#');
     case 40: return('(');
     case 41: return(')');
     case 42: return('*');
     case 43: return('+');
     case 45: return('-');
     case 47: return('/');
  }
}

int evaluate(char *s)
{   /*算术表达式求值的算符优先算法。
    设OPTR和OPND分别是运算符栈
    和操作数栈,OP为运算符集合*/
char c,theta; int a,b,e;
int c1,c3,i=0,explen;
seqstack  optr ,opnd;
initstack(&optr); push(&optr,35);
initstack(&opnd);
explen=strlen(s);  /*求表达式的长度*/
while(s[i]!='#'||gettop(&optr)!=35)
{     c=s[i];
          if(!in(c,op))
          {     c1=c-48;  /*将字符型数据转换成数字型数据*/
                 push(&opnd,c1);if(i<explen) i++;
       }
          else
          {
            switch(precede(gettop(&optr),c)) {
               case '<': push(&optr,c); if(i<explen) i++;
                         break;
               case '=': pop(&optr,&e);if(i<explen) i++;
                         break;
               case '>': pop(&optr,&c1);
                          theta=change(c1);
        pop(&opnd,&b);
            pop(&opnd,&a);
                        push(&opnd,operate(a,theta,b));
                        break;
           }
       }
}
    c1=gettop(&opnd);
   /*destroystack(optr);
   destroystack(opnd);*/
   return c1;
}

int main()
{ int val,i;
  char ss[80];
  printf("\nExp: ");
  scanf("%s",ss);
  val=evaluate(ss);
  printf("\nval=%d\n",val);
  
}
搜索更多相关主题的帖子: char int case 优先级 return 
2019-11-03 21:43
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:20 
这是多项式运算?

剑栈风樯各苦辛,别时冰雪到时春
2019-11-03 22:43
紫诺
Rank: 1
来 自:中国
等 级:新手上路
帖 子:8
专家分:0
注 册:2019-11-3
收藏
得分:0 
题目:以字符序列的形式从终端输入语法正确的、不含变量的整数表达式,只包含加、减、乘、除、括号运算,并且键盘中输入的表达式都是正确,以#作为结束符。编程实现对算术四则混合运算表达式的求值。
算法基本思想:
1先置操作数栈OPND为空栈,表达式起始符#为运算符栈的栈底元素;
2依次读入表达式中每个字符,若是操作数则进OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较优先权后作相应操作,直至整个表达式求值完毕。(即OPTR栈的栈顶元素和当前读入的字符均为#)
比较优先权后作相应操作如下:
2.1若栈顶运算符优先权低,
      则当前读来的运算符进栈,读下一个字符;
    2.2若2个运算符优先权相等,
      则脱括号,读下一个字符;
    2.3若栈顶运算符优先权高,
      则取操作数栈顶的2个元素,取运算法栈的栈顶元素,进行运算,将结果进操作数栈。
2019-11-03 22:46
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:0 
又是作业贴?

剑栈风樯各苦辛,别时冰雪到时春
2019-11-03 22:49
紫诺
Rank: 1
来 自:中国
等 级:新手上路
帖 子:8
专家分:0
注 册:2019-11-3
收藏
得分:0 
。。。。。。运行过了结果不对
2019-11-03 22:51
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:0 
7-2*3#试试,是自己写的代码?

剑栈风樯各苦辛,别时冰雪到时春
2019-11-03 22:59
紫诺
Rank: 1
来 自:中国
等 级:新手上路
帖 子:8
专家分:0
注 册:2019-11-3
收藏
得分:0 
回复 6楼 林月儿
可以了,谢谢
2019-11-03 23:12
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:0 
不客气,你这个代码不优化下?

剑栈风樯各苦辛,别时冰雪到时春
2019-11-03 23:21
快速回复:向大神求助:为什么在输入7-2*3时会出现stack underflow,该如何更改? ...
数据加载中...
 
   



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

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