数据结构(C语言)用链栈来实现计算器

数据结构链栈实现简单计算器的操作

未改进,只能计算输出结果是个位数的数值计算

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#include<iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 100 

using namespace std;
typedef  char ElemType;
typedef  int Status;


typedef struct StackNode{
     ElemType data; 
     struct StackNode *next;
     int stacksize;//栈可用的最大容量 
}StackNode,*LinkStack;

StackNode *p;

LinkStack OPND;
LinkStack OPTR;

//栈的初始化
Status InitStack (LinkStack &S)
{
   S=NULL;
   return OK;
}


//入栈
Status Push(LinkStack &S,ElemType e) 
{
	//在栈顶插入元素e
	p=new StackNode;//生成新的节点 
	p->data=e;//将新数据域置为e 
	p->next=S;//将新的元素插入栈顶 
	S=p;//修改栈顶指针为p 
	return OK; 
}



//出栈
ElemType Pop(LinkStack &S) 
{
	char e;
    //删除S栈顶元素,用e返回其值
	if(S==NULL)  return ERROR;//栈空
	e=S->data;//将栈顶元素赋值给e
    p=S;//用p临时保存栈顶空间,以被释放 
	S=S->next;//修改栈顶指针	
	delete p;//释放原栈顶元素的空间 	
	return e;
}


//取栈顶元素
ElemType GetTop(LinkStack S) 
{
    //返回S的栈顶元素,不修改栈顶指针
	if(S!=NULL) //栈非空
	    return S->data;//返回栈顶元素的值,栈顶指针不变		 
}




int ln(char ch)
{
	if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#')
	    return 1;
	else
	    return 0;
}




//比较优先级的大小 
char Precede(char t,char ch)
{
  switch(ch)
	{
		case '(':
		{
		    return '<';
		    break;}
		case '*':
		{
			if(t=='+'||t=='('||t=='-'||t=='#')
		        return '<';
		    else
		        return '>';
		    break;}
		case '/':
		{
			if(t=='+'||t=='('||t=='-'||t=='#')
		        return '<';
		    else
		        return '>';
		    break;}
			
		case '+':
		{
			if(t=='#'||t=='(')
		        return '<';
		    else
		        return '>';
		    break;}
		case '-':
		{
			if(t=='#'||t=='(')
		        return '<';
		    else
		        return '>';
		    break;}
		case ')':
		{
			if(t!='(')
		        return '=';
		        break;}
		case '#':
		{
			if(t!='#') 
		        return '>';
		        break;}
		
	}
}

//对两个数进行运算 
int Operate(int a,char c,int b)
{
	int t;
    switch(c)
    {
        case '+':
            t=a+b;break;     
        case '-':
            t=a-b;break;
        case '*':
            t=a*b;break;
        case '/':
            t=a/b;break;        
    }
    return t;   //返回计算结果 
}


int EvaluateExpression()
{
//算术表达式求值的算法优先算法,设OPTR和OPEN分别为运算符站和操作数栈
	InitStack(OPND);//初始化open栈
	InitStack(OPTR);//初始化OPTR栈
	Push(OPTR,'#');//将表达式起始符“#”压入OPTR栈底
    char ch,theta,a,b;
    int a1,b1,t;
    cin>>ch;
	while(ch!='#' || GetTop(OPTR)!='#')//将表达式没有扫描完成的OPTR的栈顶元素不为“#”
	{   
		if(!ln(ch))
		 {//ch不是运算符则进OPND栈并读取下一个字符 
	        Push(OPND,ch);
	     	cin>>ch;}
	    else{
	        switch(Precede(GetTop(OPTR),ch))
			{			
	            case'<':
		     	{
					Push(OPTR,ch);//当前字符ch压入OPTR栈,读入下一个字符
				    cin>>ch;	
					break;}
		        case'>':
				{
					theta=Pop(OPTR);//弹出OPTR栈顶的运算符
				    a=Pop(OPND);//弹出OPND栈顶的两个运算数
				    b=Pop(OPND);
				    a1=a-'0';//将字符转化为十进制 
				    b1=b-'0';
				    Push(OPND,Operate(b1,theta,a1)+'0');//因为OPND里的数据为字符型,则再将计算结果转化为字符型
				    break; }
			    case'=':
			    {
			         a=Pop(OPND);
				     b=Pop(OPND);
				     theta=Pop(OPTR);
				     a1=a-'0';  
				     b1=b-'0'; 
					 Push(OPND,Operate(b1,theta,a1)+'0'); 
			         Pop(OPTR);//弹出OPTR栈顶的“(”,读入下一个字符ch
				     cin>>ch;
				     break;}
		     }

          }
                
      }
  printf("计算结果为:%d",GetTop(OPND)-'0');//因为OPND里的数据为字符型,则再将其转化为整型			    
}


main()
{
	printf("请输入要计算的表达式:"); 
    EvaluateExpression();
 } 
  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值