zoukankan      html  css  js  c++  java
  • 用栈求算术表达式的值

    • 题目:1 将中缀表达式转换为后缀表达式
    • 2 求后缀表达式的值
    #include<stdio.h>
    
    #define MaxSize 100
    
    struct
    {
    	char data[MaxSize];
    	int top;  //栈顶指针
    }op;  //定义运算符栈
    
    struct
    {
    	float data[MaxSize];
    	int top;
    }st;  //定义数值栈
    
    void trans(char exp[],char postexp[])
    {
    	int i = 0;
    	int j = 0;
    	char ch;
    	op.top = -1;  //栈顶指针初始化为-1
    	ch = exp[i];
    	i++;
    
    	while (ch != '')
    	{
    		switch (ch)
    		{
    		case '(':  //判定为左括号 直接入栈
    			op.top++;
    			op.data[op.top] = ch;
    			break;
    		case ')':
    			while (op.data[op.top] != '(')
    			{
    				postexp[j] = op.data[op.top];
    				op.top--;
    				j++;
    			}
    			op.top--;  //左括号也出栈 但不输出
    			break;
    		case '+':
    		case '-':
    			//为 + 或者 - 时候,优先级不大于栈顶任何运算符的优先级 直到 )
    			while (op.top != -1 && op.data[op.top] != '(')
    			{
    				postexp[j] = op.data[op.top];
    				j++;
    				op.top--;
    			}
    			op.top++;
    			op.data[op.top] = ch;
    			break;
    		case '*':
    		case '/':
    			//为 * 或者是 / 时, 其优先级不大于栈顶为 * 或者为 /的优先级 直到 (
    			while (op.top != -1 && op.data[op.top] != '('
    				&& (op.data[op.top] == '*' || op.data[op.top] == '/'))
    			{
    				//将栈顶运算符弹出并输出
    				postexp[j] = op.data[op.top];
    				j++;
    				op.top--;
    			}
    			//该运算符的优先级大于栈顶运算符的优先级 直接压栈
    			op.top++;
    			op.data[op.top] = ch;
    			break;
    		case ' ':  //过滤掉空格
    			break;  
    		default:
    			while (ch >= '0' && ch <= '9') //判定为数字
    			{
    				postexp[j] = ch;
    				j++;
    				ch = exp[i];
    				i++;
    			}
    			i--;
    			postexp[j] = '#';  //用#标识一个数值串结束
    			j++;
    			break;
    		}
    		ch = exp[i];
    		i++;
    	}
    
    	while (op.top != -1)  //此时exp扫描完毕 栈不空时出栈并存放到postexp
    	{
    		postexp[j] = op.data[op.top];
    		j++;
    		op.top--;
    	}
    	postexp[j] = '';  //添加结束标识符
    }
    
    //后缀表达式的求值过程
    float Compvalue(char postexp[])
    {
    	char ch;
    	float d;
    	int i = 0;
    	ch = postexp[i];
    	i++;
    	st.top = -1;
    	while (ch != '')
    	{
    		switch (ch)
    		{
    		case '+':
    			st.data[st.top - 1] = st.data[st.top - 1] + st.data[st.top];
    			st.top = st.top - 1;
    			break;
    		case '-':
    			st.data[st.top - 1] = st.data[st.top - 1] - st.data[st.top];
    			st.top = st.top - 1;
    			break;
    		case '*':
    			st.data[st.top - 1] = st.data[st.top] * st.data[st.top - 1];
    			st.top = st.top - 1;
    			break;
    		case '/':
    			if (st.data[st.top] != 0)
    			{
    				st.data[st.top - 1] = st.data[st.top - 1] / st.data[st.top];
    				st.top = st.top - 1;
    			}
    			else
    			{
    				printf("除数为0.
    ");
    				return 0.0;
    			}
    			break;
    		default:
    			d = 0;
    			while (ch >= '0' && ch <= '9')
    			{
    				d = d * 10 + ch - '0';
    				ch = postexp[i];
    				i++;
    			}
    			st.top++;
    			st.data[st.top] = d;
    			break;
    		}
    		ch = postexp[i];
    		i++;
    	}
    	return st.data[st.top];
    }
    
    int main()
    {
    	int i = 0;
    	char exp[] = {"(2*2)*1+3*2/1"};
    	char postexp[MaxSize];
    	trans(exp,postexp);
    	while (postexp[i] != '')
    	{
    		printf("%c",postexp[i]);
    		i++;
    	}
    	printf("
    ");
    	printf("运算结果为:%f.
    ", Compvalue(postexp));
    	system("pause");
    	return 0;
    }
    

    后缀表达式求值如下:

    while(从postexp中间读取字符ch,ch != '')
    {
        若ch为数字,将后继的所有数字构成一个整数存放到数值栈st中
    	若ch为 "+",则从数值栈st中退栈两个运算数,相加后进栈st中
    	若ch为 "-",则从数值栈st中退栈两个运算数,相减后进栈st中
    	若ch为 "*",则从数值栈st中退栈两个运算数,相乘后进栈st中
    	若ch为 "/",则从数值栈st中退栈两个运算数,相除后进栈st中(若除数为0,则提示错误)
    }
    
    • 运行结果

    • 参考资料:
      1 《新编数据结构习题与解析》

  • 相关阅读:
    elasticsearch-排序(六)
    elasticsearch-分词器(五)
    elasticsearch-搜索-基本搜索(四)
    elasticsearch-文档(三)
    elasticsearch-集群(二)
    FFmpeg架构之I/O模块分析
    DirectShow 在 VS2010 中开发环境的设置
    预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)
    2012年软件开发者薪资调查报告
    深入了解 VP8
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/11413789.html
Copyright © 2011-2022 走看看