中缀表达式转后缀表达式,并求值

数据结构之栈的应用

  1. 先实现求值这一步吧,已知后缀表达式
  2. 转换这一环节待更新…

上代码:

/* 中缀表达式转后缀表达式(seqstack)以及求值
* version: 1.0(求值,需要自己输入后缀表达式)
*          2.0(加上转化功能)
* 算法: 创建一个操作数栈,自左向右遍历后缀表达式,遇到一个操作数就入栈,
*      遇到一个操作符就从栈中取出两个操作数进行当前计算,载把结果入栈,
*      直到表达式末尾, 最后一个入栈的就是最终结果
*/


#include <stdio.h>
#include <stdlib.h>

#define maxsize 100
#define datatype int

typedef struct {
	datatype data[maxsize];
	int top;		// top 指明当前栈顶元素的位置
} SeqStack, *PSeqStack;


// 初始化顺序栈
PSeqStack Init_SeqStack(){
	PSeqStack S;
	S = (PSeqStack) malloc(sizeof(SeqStack));
	//printf("%p\n", S);

	if (S)
		S -> top = -1;		// top 设为-1 (认为设定),表示空
	return S;		// 返回指向顺序栈的指针
}

// 判断栈空
int Empty_SeqStack(PSeqStack S){
	// 没有元素,空栈
	if (S -> top == -1)	
		return 1;		// 1 表示为空
	
	return 0;
	
}

// 入栈
void Push_SeqStack(PSeqStack S, datatype x){
	if (S -> top == maxsize-1){
		printf("栈满不能再入栈\n");
		//return 0;		// 返回 0 表示失败
	}
	else{
		S -> top ++;
		S -> data[S -> top] = x;
		
		//return 1;
	}
}

// 出栈,保存栈顶元素于*x中,并删除
void Pop_SeqStack(PSeqStack S, datatype *x){
	if (Empty_SeqStack(S)){
		printf("栈空不能出栈\n");
		//return 0;		// 0 表示出栈失败
	}
	else{
		*x = S -> data[S -> top];
		S -> top --;
		
		
		//return 1;
	}
}

// 取栈顶元素,只是获取他的值并存入*x,并没有取出来(删除),注意区别
int GetTop_SeqStack(PSeqStack S, datatype *x){
	if (Empty_SeqStack(S)){
		printf("栈空不能取top元素\n");
		return 0;
	}
	
	else{
		*x = S -> data[S -> top];
		return 1;
	}
}

// 销毁栈,参数为待销毁顺序栈的指针地址
void Destory_SeqStack(PSeqStack *S){
	// *S 二级指针
	if (*S)
		free (*S);
	
    *S = NULL;
	return;
}


/* 判断是否是操作数 */
int IsNum(char c){
    if (c >= '0' && c <= '9'){
        return 1;
    }

    return 0;
}

char transfer(){
    
}

/* 核心函数 */
int calculate(char *A){
    PSeqStack s = Init_SeqStack();
    int result;
    int a, b, c;    // a,b 上一次,上上一次入栈的元素,C是临时变量
    char ch;
    
    ch = *A ++;

    /* 我们人为设置,在字符数组末尾加一个'#', 作为结束符 */
    while(ch != '#'){
        if (IsNum(ch)){
            Push_SeqStack(s, ch - '0');
        }
        
        else
        {
            /* 这里注意, 先进后出 */
            Pop_SeqStack(s, &b);
            Pop_SeqStack(s, &a);

            switch (ch)
            {
                case '+':
                    c = a+b;
                    break;
                case '-':
                    c = a-b;
                    break;
                case '*':
                    c = a*b;
                    break;
                case '/':
                    c = a/b;
                    break;
                default:
                    break;
            }

            /* 临时结果入栈 */
            Push_SeqStack(s, c);
        }

        ch = *A ++;      
    }
    
    GetTop_SeqStack(s, &result);
    Destory_SeqStack(&s);
    return result;
}

int main(){
    char num[12] = {'1','2','8','5','-','*','+','4','2','/','-', '#'};

    printf("计算结果: %d\n",calculate(num));  

    return 0;
}

输入:

char num[12] = {'1','2','8','5','-','*','+','4','2','/','-', '#'};

运行结果:

qian@qian-ASUS:~/vs code/data_structure/.vscode/examples$ cd "/home/qian/vs code/data_structure/.vscode/examples/" && gcc -g mid_2_suffix.c -o mid_2_suffix && "/home/qian/vs code/data_structure/.vscode/examples/"mid_2_suffix
5
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值