数据结构栈的加减乘除计算式处理

12 篇文章 0 订阅
2 篇文章 0 订阅
/*
栈的加减乘除有关算法
@hey_超级巨星
*/
#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 50
typedef struct
{
 char data[MAXSIZE];
 int top;
}*Stack;
void InitStack(Stack &S)
{
 S->top = -1;
}
void Push(Stack& S, char ch)
{
 //假设栈足够大 不会overflow
 S->data[++S->top] = ch;
}
void Push(Stack& S, int ch)
{
 //假设栈足够大 不会overflow
 S->data[++S->top] = ch;
}
void Pop(Stack& S, char& Ch)
{
 Ch = S->data[S->top--];
}
void Pop(Stack& S, int& Ch)
{
 Ch = S->data[S->top--];
}
void getTop(Stack S,char &Ch)
{
 Ch = S->data[S->top];
}
int getTop(Stack S)
{
 int Ch;
 Ch = S->data[S->top];
}
int isEmpty(Stack S)
{
 if (S->top == -1)
  return 1;
 else 
  return 0;
}
/*
1.试编写一个算法,检查一个程序的花括号方括号圆括号是否配对,若全配对则返回1,否则返回0,对于程序中的一对单引号或双引号在内的的字符不进行括号配对
39为单引号ASCII值,34是双引号,(单双引号如果出现则必成对出现)
*/
char arr[];//存储输入的内容
int pairCheck(char arr[])
{
 Stack S;
 char ch;
 InitStack(S);
 char *ptr = arr;
 //遇到引号直接跳过其及其内容
 while (ptr!='\0')
 {
  if (*ptr == 39)
  {
   ptr++;
   while (*ptr != 39)
   {
    ptr++;
   }
   ptr++;
  }
  else if (*ptr == 34)
  {
   ptr++;
   while (*ptr != 34)
   {
    ptr++;
   }
   ptr++;
  }
  //处理括号
  else
  {
   switch (*ptr)
   {
   //左括号无条件入栈 
   case'(':
   case'[':
   case'{':Push(S,*ptr); break;
   case')':
    getTop(S, ch); 
    if (ch == '(')
     Pop(S, ch);
    else
     return 0;
    break;
   //遇到右括号 pop左括号与其配对
   case']':
    getTop(S, ch);
    if (ch == '[')
     Pop(S, ch);
    else
     return 0;    //配对失败 停止运行
    break;
   case'}':
    getTop(S, ch);
    if (ch == '{')
     Pop(S, ch);
    else
     return 0;
    break;
   }
   *ptr++;
  }
 }
 if (isEmpty(S))
  return 1;
 else
  return 0;
}
/*
2.编写一个函数求后缀的数值,其后缀存于一个字符数组exp中,exp中最后一个字符为“\0”,作为结束符,并且假设后缀式中的数字只有一位,本题中所出现的
除法运算皆为整除 运算
*/
//条件
char exp[];
//运算函数
int operate(int  a,char op,int b)
{
 if (op == '+')
 {
  return a + b;
 }
 if (op == '-')
 {
  return a - b;
 }
 if (op == '*')
 {
  return a* b;
 }
 if (op == '/')
 {
  if (b != 0)
   return a / b;
 }
 printf("ERROR\n");
};

//后缀式计算

int postCalulate(char exp[])
{
 char *p = exp;
 //存取运算数
 Stack S;
 InitStack(S);
 //存取操作数
 char op;
 int a;
 int b;
 int c;
 while (p != '\0')
 {
  if (*p >= '0' && *p <= '9')
  {
   Push(S, (*p-'0'));
  }
  else
  {
   op = *p;
   Pop(S,b);
   Pop(S,a);
   c = operate(a, op, b);
   Push(S,c);
  }
 }
 return getTop(S);
}
/*
3.中缀转后后缀函数
*/
//final[];为最终输出
//Stack S 存储符号
void trans(char arr[])
{
 char* mid = arr;
 char output[MAXSIZE];
 char* final = output;
 char ch;
 Stack S;
 InitStack(S);
 while (*mid)
 {
  //数字直接入
  if (*mid >= '0' && *mid <= '9')
  {
   *(final++) = *(mid++);
   continue;
  }
  //符号入栈
  else if (*mid == '+' || *mid == '-' || *mid == '*' || *mid == '/' || *mid == '(' || *mid == ')')
  {
   //括号优先讨论
   if (*mid = '(' || S->top == -1)
   {
    Push(S, *mid++);
    continue;
   }
   if (*mid = ')')
   {
    while (getTop(S) != '(')
    {
     Pop(S, ch);
     *(final++) = ch;
    }
    Pop(S,ch);
    mid++;
    continue;
   }
   //加减乘除
   if (*mid == '+' || *mid == '-')      //加减法 只能小于等于栈顶元素 除‘(’都要pop栈顶
   {
    Pop(S, ch);                     
    if (ch == '(')                    
     Push(S,*mid++);
    else                            //栈顶大于等于输入 pop
    {
     Pop(S, ch);
     *(final++) = ch;
     Push(S, *mid++);
     continue;
    }
   }
   else                                //乘除 优先级大于等与栈顶元素
   {
    Pop(S,ch);
    if (ch == '*' || ch == '/')   //当栈顶为同级 pop
    {
     *(final++) = ch;
     Push(S,*mid++);
     continue;
    }
    else                        //当栈顶为加减或( 
    {
     Push(S,ch);
     Push(S,*mid++);
     continue;
    }
   }
  }
 }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值