当前位置:编程学习 > C/C++ >>

表达式求值 逆波兰式

如题,代码如下,欢迎探讨!!!

[code=C/C++][/code]
/* 表达式的后缀表示及其求值 */
#include <stdio.h>

typedef int ElemType; /* 考虑到char型运算时的隐形提升会溢出,此处定义为int,代价仅浪费了内存空间 */

#define MAXNUM 16

struct stack
{
  ElemType data[MAXNUM];
  int top;
};

void StackInit(struct stack *stack)
{
  int i = 0;
  for(;i < MAXNUM;i++)
  {
  stack->data[i] = 0;
  }
  stack->top = 0; /* 栈底部从索引0处开始 */
}

void StackPush(struct stack *stack,ElemType c)
{
  if(MAXNUM == stack->top) /* 栈中元素最多有MAXNUM - 1个 */
  {
  printf("The stack is full ");
  return;
  }
  stack->data[stack->top++] = c;
}

ElemType StackPop(struct stack *stack)
{
  if(0 == stack->top)
  {
  printf("The stack is empty "); /* 当栈空时,若返回0是错误的 */
  return 0;
  }
  return stack->data[--stack->top];
}

void PostfixEvaluation(struct stack *stack)
{
  return; /* 这个函数非常简单了,所有的麻烦都已经解决了,我实在不想完成它 */
}

int ChangeToPostfix(char *str)
{
  int i = 0,flag = 0; /* flag 用来标记连续数字的出现,没想到好点的办法 */
  int c,ch;

  struct stack ch_stack;
  struct stack op_stack;

  StackInit(&ch_stack);
  StackInit(&op_stack);

  while( != (c = *(str + i))) /* 此处需注意的是:如果是静态的字符串,以为结束条件,如果是用户输入的,则以 ’为结束条件 */
  {
  if((* == c) || (/ == c) || (( == c))
  {
  flag = 0;
  StackPush(&op_stack,c);
  }
  else if() == c)
  {
  flag = 0;
  while(( != (c = StackPop(&op_stack)))
  {
  StackPush(&ch_stack,c);
  }
  if(0 == op_stack.top)
  {
  printf("the ( hasnt found when the ) come in! ");
  return -1;
  }
  }
  else if((+ == c)|| (- == c))
  {
  flag = 0;
  /* +和-优先级低,运算符栈中的((如果存在)后的所有运算符需推出 */
  if(0 != op_stack.top) /* 你可以不在此处添加top的检查,那样,你可以发现 StackPop错误返回的0被拾取了 */
  { /* 易做图无奈,只得在此检查top值,无法寄希望于StackPop了 */
  while(( != (ch = StackPop(&op_stack)))
  {
  StackPush(&ch_stack,ch);
  if(0 == op_stack.top)
  {
  break;
  }
  }
  }
  StackPush(&op_stack,c);
  }
  else if((c >= 0) && (c <= 9)) /* 对于表达式中2位或多位连续的数字,需特殊处理 */
  {
  if(0 == flag)
  {
  StackPush(&ch_stack,(c - 0));
  flag = 1;
  }
  else
  {
  StackPush(&ch_stack,10 * StackPop(&ch_stack) + (c - 0));
  }
  }
  i++;
  }
  while(0 != op_stack.top) /* 表达式处理结束,将运算符栈中的所有运算符推出并压入字符栈 */
  {
  StackPush(&ch_stack,StackPop(&op_stack));
  }

  PostfixEvaluation(&ch_stack); /* 该函数放在此处可能较为欠妥,可是,只要完成了任务不就OK了么,难道你会在乎? */

/*just test */
  for(i = 0;i < ch_stack.top;i++)
  {
  if(+ == ch_stack.data[i])
  {
  printf("+..");
  }
  else if(- == ch_stack.data[i])
  {
  printf("-..");
  }
  else if(* == ch_stack.data[i])
  {
  printf("*..");
  }
  else if(/ == ch_stack.data[i])
  {
  printf("/..");
  }
  else
  {
  printf("%d..",ch_stack.data[i]);
  }
  }

  return 0;
}


int main(void)
{
  char str[] = "12 + 34 * 435 - 5 / 1";
/* just test */
  printf("The result should be : ");
  printf("12 34 435 * + 5 1 / - [= 8] ");

  if(-1 == ChangeToPostfix(str))
  {
printf("ChangeToPostfix() error ");
return 1;
}
return 0;
}

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,