码迷,mamicode.com
首页 > 编程语言 > 详细

《数据结构与算法分析——c语言描述》读后笔记 5

时间:2015-08-16 23:30:00      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:linux c

将中缀表达式转换成后缀表达式并输出,然后计算出后缀表达式的值。

程序:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"stack.h"

char* infix_to_postfix(char* str)
{
    int i,j=0;
    int SIZE=strlen(str);
    if(str==NULL)
    {
	printf("empty string!!!\n");
	return NULL;
    }

    Stack s=CreateStack(SIZE);

    char *tmpstr=malloc(sizeof(char)*(SIZE+1));
    if(tmpstr==NULL)
    {
	printf("tmpstr is empty!\n");
	return NULL;
    }

    for(i=0;i<SIZE;++i)
    {
	if(str[i]==‘+‘)
	{
	    while(!IsEmpty(s) && Top(s)!=‘(‘ )
	    {
		tmpstr[j++]=TopAndPop(s);
      	    }
	    Push(‘+‘,s);
  	}	

	else if(str[i]==‘-‘)
	{
	    while(!IsEmpty(s) && Top(s)!=‘(‘ )
	    {
	 	tmpstr[j++]=TopAndPop(s);
	    }
	    Push(‘-‘,s);
	}

	else if(str[i]==‘*‘)
	{
	    while(!IsEmpty(s) && (Top(s)==‘*‘ || Top(s)==‘/‘) )
  	    {
		tmpstr[j++]=TopAndPop(s);
 	    }
	    Push(‘*‘,s);
	}

	else if(str[i]==‘/‘)
	{
	    while(!IsEmpty(s) && (Top(s)==‘*‘ || Top(s)==‘/‘) )
	    {
		tmpstr[j++]=TopAndPop(s);
	    }
	    Push(‘/‘,s);
	}

  	else if(str[i]==‘(‘)
	{
	    Push(str[i],s);
	}

  	else if(str[i]==‘)‘)
	{
	    while(Top(s)!=‘(‘)
	    {
		tmpstr[j++]=TopAndPop(s);
	    }
	    Pop(s);
	}

	else
	{
	    tmpstr[j++]=str[i];
	}
    }
    while(!IsEmpty(s))
    {
	tmpstr[j++]=TopAndPop(s);
    }

    return tmpstr;
}

void compute(char *goal)
{
    int i,pre,next,sum;
    Stack s=CreateStack(strlen(goal));
    if(s==NULL)
	return ;

    Push(goal[0],s);
    Push(goal[1],s);

    for(i=2;i<strlen(goal);++i)
    {
	switch(goal[i])
	{
	    case ‘*‘:
	    {
		pre=TopAndPop(s);
		next=TopAndPop(s);
		sum=(pre-‘0‘)*(next-‘0‘);
		Push((char)(sum+‘0‘),s);
		break;
	    }
	    case ‘/‘:
	    {
		pre=TopAndPop(s);
		next=TopAndPop(s);
		sum=(next-‘0‘)/(pre-‘0‘);
		Push((char)(sum+‘0‘),s);
		break;
	    }
	    case ‘+‘:
	    {
		pre=TopAndPop(s);
		next=TopAndPop(s);
		sum=(next-‘0‘)+(pre-‘0‘);
		Push((char)(sum+‘0‘),s);
		break;
	    }
	    case ‘-‘:
	    {
		pre=TopAndPop(s);
		next=TopAndPop(s);
		sum=(next-‘0‘)-(pre-‘0‘);
		Push((char)(sum+‘0‘),s);
		break;
	    }
	    default:
	    {
		Push(goal[i],s);
		break;
	    }
        }
    }
    printf("the result is : %d\n",(Top(s)-‘0‘));

}

int main()
{
    char ss[]="1+2*3+(4*1+6)";
    char* goal=infix_to_postfix(ss);
    printf("the string is :%s\n",goal);
    compute(goal); 
    return 0;
}

技术分享

上面的程序有一个缺点,那就是只能得到sizeof(char)大小的计算结果,比如char为1个字节,那么表达式计算结果最大只能为256. 原因就在compute()函数中用的栈中的数组是char类型的。如果将infix_to_postfix()函数与compute()函数分开,写入不同的.c文件中,使他们调用的栈的数组分别为char和int类型的,那么就可以计算任意范围的表达式了。

《数据结构与算法分析——c语言描述》读后笔记 5

标签:linux c

原文地址:http://yuzwei.blog.51cto.com/10126623/1685023

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