表达式求值【栈】

好好学习,天天向上T^T

代码写的很恶心很混乱尤其是没贴上来的。。所以只贴上来主要的一段T^T,

写窗口时想复习一下暑假的东西。。可是很明显我太高估自己记忆力了。一个月完全没怎么接触就忘得差不得一干二净,只好把之前的代码再仔细地瞅一遍了T^T

身边的人都是大神,压力好大甚至最近开始觉得睡午觉时间长了都是一种罪过T^T。。

瞬间觉得脑子不够用了,bug找了好长时间才发现果然是粗心惹的祸T^T【论:一个*p可以浪费的时间】

【就在刚才的一瞬间又把窗口给弄坏了。。。



===========分界线先生=============


思路:

1、 定义运算符高低顺序;

2、 将表达式以字符串的形式读入;

3、 分离运算数字和运算符号,数字进数字栈,运算符进运算符栈;

4、 若栈外运算符高于栈内,则入栈,否则运算符出栈,运算数出栈两个,运算后将结果压入运算数栈;

5、 左括号入栈,遇到右括号则一直出栈运算直至左括号出栈;



int Level(char op)///定义运算级别
{
	int x;
	switch(op)
	{
	case '+': x=2;break;
	case '-': x=2;break;
	case '*': x=3;break;
	case '/': x=3;break;
	case '(': x=1;break;
	case '@': x=0;break;
	}
	return x;
}

int Cal(char op,int x1,int x2)///计算
{
	int x;
	switch(op)
	{
	case '+': x=x2+x1;break;
	case '-': x=x2-x1;break;
	case '*': x=x2*x1;break;
	case '/': x=x2/x1;break;

	}
	return x;
}

int Process(char s[])///表达式处理及计算过程
{
	char sop[100],*p;
	char op;
	int snum[100];
	int top=0,tnum=-1;
	int y,x1,x2;
	sop[top]='@';
	p=s;
	while(*p)
	{
		if(*p>='0'&&*p<='9')
		{
            y=0;
			while(*p>='0'&&*p<='9')/数字处理
			{
				y=y*10+(*p-'0');
				p++;
			}
			snum[++tnum]=y;
     		
		}
		else if((*p=='+')||(*p=='-')||(*p=='*')||(*p=='/'))
		{
			while(Level(*p)<=Level(sop[top]))
			{
				op=sop[top--];
		                x1=snum[tnum--];
		                x2=snum[tnum--];
		                snum[++tnum]=Cal(op,x1,x2);
			
			}
			sop[++top]=*p++;
		}
		else if(*p=='(')
			sop[++top]=*p++;
		else if(*p==')')
		{
			while(sop[top]!='(')
		
			{
				op=sop[top--];
		                x1=snum[tnum--];
		                x2=snum[tnum--];
		                snum[++tnum]=Cal(op,x1,x2);
			}
			top--;
			p++;
		}
		else p++;
	}
	while(sop[top]!='@')
	{
		op=sop[top--];
		x1=snum[tnum--];
		x2=snum[tnum--];
		snum[++tnum]=Cal(op,x1,x2);
	}

	
	return snum[tnum];
}


/*==================窗口处理========================*/


BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
        HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
		HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
    }

    return FALSE;
}

BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    return TRUE;
}

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
	char a[1000],c[1000];
	int Res;

    switch(id)
    {
	
        case IDC_dy:
		{	
			GetDlgItemText(hwnd,IDC_1,a,sizeof(a));
			
			Res=Process(a);
			itoa(Res,c,10);
			
			SetDlgItemText(hwnd,IDC_3,c);

		}
        break;
        default:		break;
    }
}

void Main_OnClose(HWND hwnd)
{
    EndDialog(hwnd, 0);
}


p.s.上述代码中无主函数


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值