码迷,mamicode.com
首页 > 其他好文 > 详细

栈的应用举例-进行算术运算

时间:2014-06-05 07:35:18      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:c   class   blog   code   a   int   

   这个例子是来自于严蔚敏的《数据结构》的栈那一节。 但是我进行了一些简单的修改,确保编译通过。

目的:利用栈 计算 “3*(7-2)”这样的字符串的算术运算的结果。 共有3个代码文件,如下:

1、mystack.h

       

#pragma once


#define maxsize 30
typedef struct
{
	char data[maxsize+1];
    int top;
}Stack;

int Push(Stack& S,char x);
int Pop(Stack& S,char& x);
char readtop(Stack S);



 

2、mystack.cpp

#include "mystack.h"
#include "stdio.h"

int Push(Stack& S,char x)
{
	if (S.top==maxsize)
	{
		printf("overflow\n"); 
		return(0);
	}
	S.data[++S.top]=x; 
	return(1);
}

int Pop(Stack& S,char& x)
{
	if(S.top==0)
	{
		printf("undertflow\n");
		return(0);
	}
	x=S.data[S.top]; 
	S.top--;
	return(1);
}

char readtop(Stack S)
{
	char a;
          a=S.data[S.top]; 
	return(a);
}



 

3、 caclstack.cpp

#include <iostream>
#include <string>
#include "mystack.h"
using namespace std;


double operate(char ch, double x,double y);

int precede(char p1,char p2);

double calcul(char a[]);
 
//这是进行测试的main 函数
int main()
{
	char tmp[]="3*(7-2)#";  // 输入的字符串一定要以# 结尾。
        // char tmp[]="3*(7-2)+5*2#";
	double rst = calcul(tmp);
	cout<<rst<<endl;
	getchar();

	return 0;
}

double operate(char ch, double x,double y)
{
	double z;
	switch (ch)
	{
	case '+' : z=x+y; break;
	case '-' : z=x-y; break;
	case '*' : z=x*y; break;
	case '/' : z=x/y; break;
	}
	return((char)z);
}

//这个函数最关键
int precede(char p1,char p2)
{
	int flag = -2;
	switch (p1)
	{
	case '+' : 
		if(p2=='*' || p2=='/' || p2== '(' ) flag=-1;
		else flag=1;
		break;
	case '-' : 
		if(p2=='*' || p2=='/' || p2== '(' ) flag=-1;
		else flag=1;
		break;
	case '*' : 
		if(p2=='(' ) flag=-1;
		else flag=1;
		break;
	case '/' : 
		if(p2=='(' ) flag=-1;
		else flag=1;
		break;
	case '(' : if(p2==')') flag=0;
			   else if(p2=='#')printf("error 1 operator!\n");
			   else flag=-1;
			   break;
	case ')' : if(p2=='(' )printf("error 2 operator!\n");
			   else flag=1;
			   break;
	case '#' : if(p2==')' )printf("error 3 operator!\n");
				else if(p2=='#' ) 
					flag=0;
				else 
					flag=-1;
				break;
	}
	return(flag);
}


double calcul(char a[])
{
	Stack S1, S2;
	S1.top = 0; 
	S2.top = 0;
	double x, y, z;
	char x1,x2;
	char r, ch;
	int I=0;
	Push(S1,'#'); 
	r=a[I];
	//while(r<>'#' || readtop(S1)<>'#')
	while(r != '#' || readtop(S1) != '#')
	{
		if(r<='9' && r>='0')
		{ 
			x=0;
			while(r<='9' && r>='0')
			{
				x=x*10+r-'0';
				r=a[++I];
			}
			Push(S2,x);
		}
		else 
			switch(precede(readtop(S1),r))
		{
			case -1: 
				Push(S1,r); r=a[++I]; break; //把运算符放进栈1
			case 0:
				Pop(S1,ch); 
				r=a[++I];
				//r=a[I];
				break; //弹出一个运算符
			case 1: 
				Pop(S1, ch); Pop(S2, x1); Pop(S2, x2);
				Push(S2,operate(ch, x2,x1));
				//r=a[++I]; 
                 r=a[I];
				break;
		}
	}
	return(readtop(S2));
}


 

以上代码在VS 下编译通过,并且执行结果正确。

注意:本文的栈 是用的自定义 的mystack。

另外更多原理 请参考 严蔚敏的数据结构相关章节。

栈的应用举例-进行算术运算,布布扣,bubuko.com

栈的应用举例-进行算术运算

标签:c   class   blog   code   a   int   

原文地址:http://blog.csdn.net/zhongjling/article/details/27379801

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!