(c语言)堆栈计算后缀表达式(包含测试用例)

本实验取材于浙江大学《数据结构》,计算后缀表达式,关键在于理解堆栈的工作顺序

//堆栈的应用案例--表达式求值
//表达式求值的基本步数
//1当读入的是一个运算数时,把它被压入栈中;
//2当读入的是一个运算符时,就从堆栈中弹出适当数量的运算数
//对该运算进行计算,计算结果再压回到栈中。
//处理完整个后缀表达时之后,堆栈顶上的元素就是表达时的结果值

下面利用堆栈的顺序存储进行运算!


#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define MAXOP 100//操作数序列可能的最大长度
#define INFINITY 1e9//代表正无穷
#define ERROR -1
typedef double ElementType;//将堆栈的元素类型具体化
//类型依次对应运算符、运算符、字符串结尾

typedef enum{num,opr,end} Type;
typedef int Position;
typedef struct SNode *PtrToStack;

struct SNode{
	ElementType *Data;
	Position Top;
	int MaxSize;
};
typedef PtrToStack Stack;
Stack CreateStack(int MaxSize);//生成空堆栈,其最大长度为Maxsize
int IsFull(Stack S);//判断堆栈S是否已满
int Push(Stack S,ElementType X);//将元素item压入堆栈
int IsEmpty(Stack S);//判断堆栈S是否为空
ElementType Pop(Stack S);//删除并返回栈顶元素
Stack CreateStack(int MaxSize){
	Stack S=(Stack)malloc(sizeof(struct SNode));
	S->Data = (ElementType *)malloc(MaxSize*sizeof(ElementType));
	S->Top = -1;
	S->MaxSize = MaxSize;
	return S;
}
int IsFull(Stack S){
	return (S->Top==S->MaxSize-1);
}

int Push(Stack PtrS,ElementType X)
{
	if(IsFull(PtrS)){
		printf("堆栈满");
		return ERROR;
	}else{
		PtrS->Data[++(PtrS->Top)] = X;
		return PtrS->Data[PtrS->Top];
	}
}
int IsEmpty(Stack S){
	return (S->Top==-1);
}
ElementType Pop(Stack PtrS)
{
	if(PtrS->Top==-1){
		printf("堆栈空");
		return ERROR;
	}else{
		return (PtrS->Data[(PtrS->Top)--]);
	}
}
Type Getop(char *Expr,int *start,char *str)
{
	//从*start开始读入下一个对象(操作数或运算符),并
	//保存在字符串str中
	int i=0;
	while((str[0]=Expr[(*start)++])==' ');
	while(str[i]!=' ' && str[i]!='\0')
		str[++i]=Expr[(*start)++];
	if(str[i]!='\0')//如果读到输入结尾
		(*start)--;//start指向结束符
	str[i]='\0';//结束一个对象的获取
	if(i==0) return end;//读到了结束
	else if(isdigit(str[0]) || isdigit(str[1]))
		return num;//表示此时str中存的是一个数字
	else    //表示str不是空串,又不是数字
		return opr; //表示此时str中存的是一个运算符
		
	
}
ElementType PostfixExp(char *Expr)
{
	Stack S;
	Type T;
	ElementType Op1,Op2;
	char str[MAXOP];
	int start=0;
	//申请一个新堆栈
	S=CreateStack(MAXOP);
	Op1 = Op2=0;
	while((T=Getop(Expr,&start,str))!= end){
		//当为读到输入结束时
		if(T==num)
			Push(S,atof(str));
		else{
			if(!IsEmpty(S)) Op2 = Pop(S);
			else Op2 = INFINITY;
			if(!IsEmpty(S)) Op1 = Pop(S);
			else Op2 = INFINITY;
			switch(str[0]){
				case '+':Push(S,Op1+Op2);break;
				case '*':Push(S,Op1*Op2);break;
				case '-':Push(S,Op1-Op2);break;
				case '/':
					if(Op2 != 0.0)
						Push(S,Op1/Op2);
					else{
						printf("falut div is zero\n");
						Op2 = INFINITY;
					}
					break;
				default:
					printf("fault unknown fault%s\n",str);
					Op2 = INFINITY;
					break;
			}
			if(Op2>=INFINITY) break;
		}
	}
	if(Op2<INFINITY)
		if(!IsEmpty(S))
			Op2=Pop(S);
		else
			Op2 = INFINITY;
		free(S);
		return Op2;
}
int main()
{
	char Expr[MAXOP];
	ElementType f;
	gets(Expr);
	f=PostfixExp(Expr);
	if(f<INFINITY)
		printf("%.4f\n",f);
	else
		printf("function is fault\n");
	return 0;
}
逻辑表达式计算测试用例包括以下内容: 1. 测试用例中只包含0和1两种数字,以及逻辑运算符(&、|、!)和括号(())。 2. 针对不同的逻辑运算符,可以设计测试用例来验证其正确性。比如,对于And(&)运算符,可以设计测试用例,其中两个操作数都为1时,结果为1;其他情况下,结果都为0。对于Or(|)运算符,可以设计测试用例,其中两个操作数都为0时,结果为0;其他情况下,结果都为1。对于Not(!)运算符,可以设计测试用例,其中操作数为1时,结果为0;操作数为0时,结果为1。 3. 可以设计测试用例来验证不同运算符之间的优先级关系。比如,对于表达式“1&0|1”,根据优先级关系,先计算And运算符,结果为0;再计算Or运算符,结果为1。 4. 可以使用等价类法来设计测试用例。根据不同的等价类,设计测试用例来覆盖各种情况。比如,对于And运算符,可以设计测试用例来覆盖两个操作数都为0、两个操作数都为1、一个操作数为0一个操作数为1的情况。对于Or运算符和Not运算符,也可以设计类似的测试用例。 总之,逻辑表达式计算测试用例需要覆盖各种情况,包括不同运算符的组合、不同运算符之间的优先级关系等。通过设计全面的测试用例,可以验证逻辑表达式计算的正确性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [逻辑计算](https://blog.csdn.net/h2498864708/article/details/106355599)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [软件测试大牛都是这样写测试用例的,你get到了嘛?](https://blog.csdn.net/weixin_47197994/article/details/106506811)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值