/*
栈的加减乘除有关算法
@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;
}
}
}
}
}
数据结构栈的加减乘除计算式处理
最新推荐文章于 2023-05-27 21:42:09 发布