怎么用C语言编写堆栈并能进行四则运算
展开全部
3个文件,按您的要求
头文件H
#IFNDEF _XXXX_H
#定义_XXXX_H
#定义错误-1
#定义MAX 100 / *定义堆栈的大小* /
静态int堆栈[MAX]; / *定义一个一维数组堆栈* /
静态int top = 0的; / *自定义堆栈指令* /
诠释推(int i)的;
的pop();
#ENDIF / * _XXXX_H * /
功能文件CPP
#包括“xxxx.h”的
诠释推(I)/ *内存操作数栈操作* /
{
??(顶部<MAX)
???
????栈[+ +顶部] = I / *栈,仍然有空间的堆栈顶部的表示移动一个位置* /
????返回0;
??}
??其他
???
????printf的(“堆栈满了”);
????返回错误;
??}
}
POP()/ *删除的操作数,并弹出操作* /
{
??VAR; / *定义要返回的顶级元素* /
??如果(top! = NULL)/ *仍然堆放元素* /
???
????VAR =栈[ - ] / *堆栈指针向下移动一个位置* /
????返回VAR / *返回的顶部堆栈元素* /
??}
??其他
????printf的(“堆栈是空的!\ n”);
??返回错误;
}
主文件CPP
#包括<stdio.h>
#包括<conio.h>
#包括<stdlib.h>
#包括“xxxx.h”的
无效的主要()
{
??INT M,N;
??字符L;
??整数A,B,C;
??整数K;
??{
????输出(“\ n \ n \ t单击以下提示输入你需要的信息\ n”);
????输出(“\ n \问你输入第二个捣弄数字”);
????scanf的(“%d”,&M);
????推(M)/ *第一个操作数堆栈* /
????输出(“\ n \问你输入第二个捣弄数字”);
????scanf的(“%d”,&N);
????推(N); / *第二个操作数堆栈* /
????输出(“\ n \你不想算术运算(+ / - / * / /):”);
????L = getche(); / *输入操作符* /
????开关(L)/ *确定的运营商,依次执行代码* /
????
??????'+':
????????= pop()方法;
????????= pop()方法;
????????C = A + B;
????????输出(“\ n \ n \ t计算公式为:%d条\ n”,c);
????????输出(“\ n”);
????????;
??????情况下,' - ':
????????= pop()方法;
????????= pop()方法;
????????C = A-B;
????????输出(“\ n \ n \ t计算公式为:%d条\ n”,c);
????????输出(“\ n”);
????????;
??????情况下,'*':
????????= pop()方法;
????????= pop()方法;
????????C = A * B;
????????输出(“\ n \ n \ t计算公式为:%d条\ n”,c);
????????输出(“\ n”);
????????;
??????情况下,'/':
????????= pop()方法;
????????= pop()方法;
????????C = A / B;
????????输出(“\ n \ n \ t计算公式为:%d条\ n”,c);
????????输出(“\ n”);
????????;
????}
????输出(“\ t要继续输入计算吗?(Y / N):”); / *提示用户是否在程序结束* /
????L = getche();
????(L =='N')
??????退出(0);
??}(1);
}
头文件H
#IFNDEF _XXXX_H
#定义_XXXX_H
#定义错误-1
#定义MAX 100 / *定义堆栈的大小* /
静态int堆栈[MAX]; / *定义一个一维数组堆栈* /
静态int top = 0的; / *自定义堆栈指令* /
诠释推(int i)的;
的pop();
#ENDIF / * _XXXX_H * /
功能文件CPP
#包括“xxxx.h”的
诠释推(I)/ *内存操作数栈操作* /
{
??(顶部<MAX)
???
????栈[+ +顶部] = I / *栈,仍然有空间的堆栈顶部的表示移动一个位置* /
????返回0;
??}
??其他
???
????printf的(“堆栈满了”);
????返回错误;
??}
}
POP()/ *删除的操作数,并弹出操作* /
{
??VAR; / *定义要返回的顶级元素* /
??如果(top! = NULL)/ *仍然堆放元素* /
???
????VAR =栈[ - ] / *堆栈指针向下移动一个位置* /
????返回VAR / *返回的顶部堆栈元素* /
??}
??其他
????printf的(“堆栈是空的!\ n”);
??返回错误;
}
主文件CPP
#包括<stdio.h>
#包括<conio.h>
#包括<stdlib.h>
#包括“xxxx.h”的
无效的主要()
{
??INT M,N;
??字符L;
??整数A,B,C;
??整数K;
??{
????输出(“\ n \ n \ t单击以下提示输入你需要的信息\ n”);
????输出(“\ n \问你输入第二个捣弄数字”);
????scanf的(“%d”,&M);
????推(M)/ *第一个操作数堆栈* /
????输出(“\ n \问你输入第二个捣弄数字”);
????scanf的(“%d”,&N);
????推(N); / *第二个操作数堆栈* /
????输出(“\ n \你不想算术运算(+ / - / * / /):”);
????L = getche(); / *输入操作符* /
????开关(L)/ *确定的运营商,依次执行代码* /
????
??????'+':
????????= pop()方法;
????????= pop()方法;
????????C = A + B;
????????输出(“\ n \ n \ t计算公式为:%d条\ n”,c);
????????输出(“\ n”);
????????;
??????情况下,' - ':
????????= pop()方法;
????????= pop()方法;
????????C = A-B;
????????输出(“\ n \ n \ t计算公式为:%d条\ n”,c);
????????输出(“\ n”);
????????;
??????情况下,'*':
????????= pop()方法;
????????= pop()方法;
????????C = A * B;
????????输出(“\ n \ n \ t计算公式为:%d条\ n”,c);
????????输出(“\ n”);
????????;
??????情况下,'/':
????????= pop()方法;
????????= pop()方法;
????????C = A / B;
????????输出(“\ n \ n \ t计算公式为:%d条\ n”,c);
????????输出(“\ n”);
????????;
????}
????输出(“\ t要继续输入计算吗?(Y / N):”); / *提示用户是否在程序结束* /
????L = getche();
????(L =='N')
??????退出(0);
??}(1);
}
展开全部
用一个栈就可以,需要先把运算式改一下,改成那种运算数在前面,运算符在后面
比如
a+b -> ab+
(a+b) * (c+d) + c -> (ab+)(cd+)c*+
然后由右向左进栈。。。
出栈应该是ab+先出栈就对了
比如
a+b -> ab+
(a+b) * (c+d) + c -> (ab+)(cd+)c*+
然后由右向左进栈。。。
出栈应该是ab+先出栈就对了
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
两个栈,分别存放符号(+-*/())和运算数
然后按照运算符优先级弹出运算数和符号再将运算结果压入运算数的栈,最后运算符栈空了,运算数栈只剩下一个数,那就是最后的结果。
然后按照运算符优先级弹出运算数和符号再将运算结果压入运算数的栈,最后运算符栈空了,运算数栈只剩下一个数,那就是最后的结果。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
数据结构的书上有完整实现。在这里说不清。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询