本人水平有限,记录一下日常作业
如果不是来装逼的,欢迎指点
代码的实现,注释比较详细了
中缀表达式求值
输入一个中缀表达式,输出结果
#include<stdio.h>
#include<stdlib.h>
#define Max_Size 400
struct stu {
int shu[Max_Size]; //创建一个空栈
int top;
}Shuju;
struct
{
char shu[Max_Size];
int top;
}Fuhao;
struct stu3 //创建一个空栈用于比较
{
char op;
int pri;
}pan;
//定义运算符优先级
struct stu3 dy[] = { {'(',1},{'+',2},{'-',2},{'*',3} ,{'/',3},{')',1} };
//比较符号栈内的运算符和即将入栈运算符的优先级
int compare(char pd)
{
int i = 0;
int left = 0;
int right = 0;
for (i = 0; i <=5; i++)
{
if (Fuhao.shu[Fuhao.top]== dy[i].op) //判断栈内的优先级
{
left= dy[i].pri;
}
if (pd==dy[i].op) //判断入栈的优先级
{
right = dy[i].pri;
}
}
if (left < right) //如果栈内小于栈外
{
return 0; // 返回0
}
if (left >= right) //如果栈内大于等于栈外
{
return 1; //返回1
}
}
int zhuan(x) //定义一个函数用来把字符数转化成整形
{
x = x - 48; //字符数减去asicii码值
return x; //返回值
}
void jisuan()
{
int f1 = Fuhao.shu[Fuhao.top ];
int num1 = Shuju.shu[Shuju.top ]; //弹出数据栈栈顶元素
int num2 = Shuju.shu[Shuju.top - 1]; //弹出数据站栈顶元素
Fuhao.top--;
Shuju.top --;
if (f1 == '+') //如果f1为加号
{
num2 = num1 + num2; //进行加运算
Shuju.shu[Shuju.top] = num2; //结果放回数据栈顶
}
if (f1 == '-') //如果f1为减号
{
num2 = num2-num1; //进行减运算
Shuju.shu[Shuju.top] = num2; //结果放回数据栈顶
}
if (f1 == '*') //如果f1为乘号
{
num2 = num2 * num1; //进行乘运算
Shuju.shu[Shuju.top] = num2; //结果放回数据栈顶
}
if (f1 == '/') //如果f1为除号
{
num2 = num2 / num1; //进行除运算
Shuju.shu[Shuju.top] = num2; //结果放回数据栈顶
}
}
int main()
{
memset(Shuju.shu,0,Max_Size); //数字栈的初始化
memset(Shuju.shu,0,Max_Size);//符号栈的初始化
Shuju.top =-1; //数字栈的指向符初始化
Fuhao.top =-1;
char str[Max_Size]; //定义一个字符数组存放表达式
int top_str = 0;
int a ; //定义一个变量接受compare返回值
printf("请输入表达式:\n");
scanf_s("%s",str,100); //获取表达式
while (str[top_str] != '\0') //判断是否为空位
{
if (str[top_str] >= 48 && str[top_str] <= 57) //判断是否为数字
{
Shuju.top++; //数据数组尾标加一
Shuju.shu[Shuju.top] = zhuan(str[top_str]); //把数字压入数据栈
top_str++; //表达式数组尾标加一
}
//是运算符
else
{
if (Fuhao.top == -1) //判断是否为第一位
{
Fuhao.top++; //符号数组尾标加一
Fuhao.shu[Fuhao.top] = str[top_str]; //第一位直接压入符号栈
top_str++;
}
else if (str[top_str] == '(') //判断是否为左括号
{
Fuhao.top++; //符号数组尾标加一
Fuhao.shu[Fuhao.top] = str[top_str]; //左括号直接压入符号栈
top_str++;
}
else if (str[top_str] == ')') //判断是否为右括号
{
while (Fuhao.shu[Fuhao.top ] != '(')
{
jisuan();
}
top_str++;
Fuhao.top--; //符号栈栈顶减一
}
//如果是运算符
else if (str[top_str] == '+' || str[top_str] == '-' || str[top_str] == '*' || str[top_str] == '/')
{
a = compare(str[top_str]); //接受返回值
switch (a) //分情况讨论
{
case 0: //a为0
{
Fuhao.top++;//符号栈尾标加一
Fuhao.shu[Fuhao.top] = str[top_str]; // 运算符入符号栈
top_str++;
break;
}
case 1: //a为1
{
jisuan();
break;
}
}
}
}
}
while (Fuhao.top!=-1) //符号栈内还有运算符执行循环
{
jisuan(); //计算
}
printf("%d",Shuju.shu[Shuju.top]); //输出结果
return 0;
}
中缀转后缀求值
输入一个中缀表达式,输出后缀表达式和计算结果
#include<stdio.h>
#include<stdlib.h>
#define Max_size 100
struct //创建一个栈存放后缀表达式
{
char shu[Max_size];
int top;
}shuju;
struct //创建一个栈存放中转时的符号
{
char shu[Max_size];
int top;
}fuhao;
struct stu3 //创建一个空栈用于比较
{
char op;
int pri;
}pan;
//定义操作符优先级
struct stu3 dy[] = { {'(',1},{'+',2},{'-',2},{'*',3} ,{'/',3},{')',1} };
int zhuan(x)
{
x = x - 48;
return x;
}
int compare(char pd)
{
int i = 0;
int left = 0;
int right = 0;
for (i = 0; i <= 5; i++)
{
if (fuhao.shu[fuhao.top] == dy[i].op) //判断栈内的优先级
{
left = dy[i].pri;
}
if (pd == dy[i].op) //判断入栈的优先级
{
right = dy[i].pri;
}
}
if (left < right) //如果栈内小于栈外
{
return 0; // 返回0
}
if (left >= right) //如果栈内大于等于栈外
{
return 1; //返回1
}
}
int main()
{
char cun[Max_size]; //定义一个字符数组存放中缀表达式
int top_cun; //定义下标
memset(shuju.shu,0,Max_size); //栈的初始化
memset(fuhao.shu, 0, Max_size); //栈的初始化
shuju.top = -1; //下标初始化
fuhao.top = -1; //下标初始化
top_cun = 0; //下标初始化
char b=0; //初始化
int a; //接受compare返回值
printf("input:"); //输入
printf("\n"); //换行
scanf_s("%s",cun,60); //接收表达式
while (cun[top_cun] != '\0') //判断表达式是否结束
{
if (cun[top_cun] >= 48 && cun[top_cun] <= 57) //判断是否是数字
{
shuju.top++; //栈顶加一
shuju.shu[shuju.top] = cun[top_cun]; //直接存入数据栈
top_cun++; //字符数组下标加一
}
else
{
if (fuhao.top == -1) //判断是否是第一个符号
{
fuhao.top++;
fuhao.shu[fuhao.top] = cun[top_cun]; //第一位直接压入符号栈
top_cun++;
}
else if(cun[top_cun]=='(') //判断是否为左括号
{
fuhao.top++; //栈顶加一
fuhao.shu[fuhao.top] = cun[top_cun]; //左括号直接压入符号栈
top_cun++; //字符数组下标加一
}
//如果是运算符
else if (cun[top_cun]=='+'||cun[top_cun]=='-'||cun[top_cun]=='*'||cun[top_cun]=='/')
{
a = compare(cun[top_cun]); //接受返回值
switch (a) //分情况讨论
{
case 0: //a为0
{
fuhao.top++;//符号栈尾标加一
fuhao.shu[fuhao.top] = cun[top_cun]; // 运算符入符号栈
top_cun++;
break;
}
case 1: //a为1
{
shuju.top++; //栈顶加一
//符号栈栈顶放入数据栈
shuju.shu[shuju.top] = fuhao.shu[fuhao.top];
fuhao.top--; //栈顶减一
break;
}
}
}
else if(cun[top_cun]==')') //如果是右括号
{
while (fuhao.shu[fuhao.top]!='(') //不是左括号继续循环
{
shuju.top++; //栈顶加一
//符号栈栈顶放入数据栈
shuju.shu[shuju.top] = fuhao.shu[fuhao.top];
fuhao.top--; //栈顶减一
}
top_cun++;
fuhao.top--; //弹出左括号
}
}
}
while (fuhao.top!=-1) //若符号栈内还有符号
{
shuju.top++; //栈顶加一
shuju.shu[shuju.top] = fuhao.shu[fuhao.top];//符号栈顶放入数据栈
fuhao.top--; //栈顶减一
}
printf("后缀表达式为:\n");
printf("%s",shuju.shu); //输出后缀表达式
printf("\n");
int jisuan[Max_size]; //定义整形数组存储计算结果
int top_ji; // 定义下标
top_ji = -1; //下标初始化
shuju.top = 0; //令shuju栈的下标为0
while (shuju.shu[shuju.top] != '\0') //判断栈内是否为空
{
//如果是数字,减48放入jisuan数组中
if (shuju.shu[shuju.top] >= 48 && shuju.shu[shuju.top] <= 57)
{
top_ji++; //栈顶加一
jisuan[top_ji] = shuju.shu[shuju.top] - 48; //存入jisuan数组中
shuju.top++; //栈顶加一
}
else if (shuju.shu[shuju.top] == '+') //如果是加号执行加法操作
{
int num1 = jisuan[top_ji]; //从jisuan数组中取出数字
int num2 = jisuan[top_ji-1]; //从jisuan数组中取出数字
num1 = num1 + num2; //执行加法
jisuan[top_ji - 1] = num1; //计算结果存入数组
top_ji--; //栈顶减一
shuju.top++; //栈顶加一
}
else if (shuju.shu[shuju.top] == '-') //如果是减号执行加法操作
{
int num1 = jisuan[top_ji]; //从jisuan数组中取出数字
int num2 = jisuan[top_ji - 1]; //从jisuan数组中取出数字
num1 = num2 - num1; //执行减法
jisuan[top_ji - 1] = num1; //计算结果存入数组
top_ji--; //栈顶减一
shuju.top++; //栈顶加一
}
else if (shuju.shu[shuju.top] == '*') //如果是乘号执行加法操作
{
int num1 = jisuan[top_ji]; //从jisuan数组中取出数字
int num2 = jisuan[top_ji - 1]; //从jisuan数组中取出数字
num1 = num2 * num1; //执行乘法
jisuan[top_ji - 1] = num1; //计算结果存入数组
top_ji--; //栈顶减一
shuju.top++; //栈顶加一
}
else if (shuju.shu[shuju.top] == '/') //如果是乘号执行加法操作
{
int num1 = jisuan[top_ji]; //从jisuan数组中取出数字
int num2 = jisuan[top_ji-1]; //从jisuan数组中取出数字
num1 = num2 / num1; //执行除法
jisuan[top_ji-1] = num1; //计算结果存入数组
top_ji--; //栈顶减一
shuju.top++; //栈顶加一
}
}
printf("%d",jisuan[top_ji]); //输出结果
return 0;
}