+ -
当前位置:首页 → 问答吧 → 求大神指点

求大神指点

时间:2011-12-08

来源:互联网

#include<iostream>
using namespace std;
#include<stdio.h>
#include <stdlib.h>
const int Initsize=100;//栈的长度
int change1(char a)//由字符转换成数字
{
  return ((int)a-48);
}
int change2(int a)//由数字转换成字符
{
  return (char)(a+48);
}
class stack{
public:
  char *base;//栈的基指针
  char *top;//栈的顶指针
  friend void initstack(stack &s);//构造栈
  friend void push(stack &s,char a);//压入栈
  friend int gettop(stack &s);//得到栈顶元素不删除
  friend int pop(stack &s);//得到栈顶元素并删除
};
void initstack(stack &s)
{
  s.base=new char[Initsize];
  if(s.base)
  s.top=s.base;
}
void push(stack &s,char a)
{
  if(s.top-s.base<=Initsize)
  {
  *s.top=a;
  s.top++;
  }
  else
  exit(0);
}
int gettop(stack &s)
{
  if(s.top==s.base)
  exit(0);
  char a=*(s.top-1);
  return change1(a);
}
int pop(stack &s)
{
  if(s.top==s.base)
  exit(0);
  char a=*(s.top--);
  return change1(a);
}
int operatorsize(char a)//操作符的优先级
{
  int n;
  switch(a)
  {
  case '#':n=1;break;
  case '(':n=2;break;
  case '+':
  case '-':n=3;break;
  case '*':
  case '/':n=4;break;
  default:exit(1);
  }
  return n;
}
void operate(stack &s,char a)
{
  switch(a)
  {
  case '+':push(s,change2(pop(s)+change1(a)));break;
  case '-':push(s,change2(pop(s)-change1(a)));break;
  case '*':push(s,change2(pop(s)*change1(a)));break;
  case '/':push(s,change2(pop(s)/change1(a)));break;
  case '#':break;
  default:exit(1);break;
  }
}
int main()
{
  char c;
  stack optr,opnd;
  initstack(optr);push(optr,'#');
  initstack(opnd);
  cout<<"*********欢迎使用本系统**********"<<endl;
  cout<<"请输入表达式: "<<endl;
  c=getchar();
  cout<<"计算结果是:";
  while(c='#'||gettop(optr)!='#')
  {
  if(!operatorsize(c))
  {
  push(opnd,c);
  }
  else
  {
  int m,s,n;
  s=operatorsize(gettop(optr));//栈顶操作数优先级
  n=operatorsize(c);//当前操作数优先级
  m=s-n;
  if(m>0)
  push(optr,c);
  else if(m=0)
  pop(optr);
  else
  {
  operate(opnd,c);
  pop(optr);
  }
  }
  c=getchar();
  }
  cout<<change1(gettop(opnd));
  return 0;
}
这是一个数值表达式求值问题,编译没错就是得不出结果,求大神指点

作者: xinxisxx   发布时间: 2011-12-08

int operatorsize(char a)中default:时候你直接退出了exit(1);
单步debug一下

作者: duzhongming   发布时间: 2011-12-08

热门下载

更多