0
点赞
收藏
分享

微信扫一扫

西工大NOJ数据结构理论——008.逆波兰式(耿3.8)

腊梅5朵 2022-03-26 阅读 65

 

1.('('!=c1)&&(')'==c2)之后

2.('('==c1)&&(')'==c2)之后

3.('('==c1)||('('==c2) 之后

4.('*'==c1)||('/'==c1)之后

 

 5.('*'==c2)||('/'==c2)之后

6.最后只剩下一种情况,结果

 

 代码实现:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
typedef struct NODE{//结点类型 
	char c;
	struct NODE* next;
}NODE;

typedef struct plstack{//栈指针类型 
	struct NODE* top;
}plstack;

plstack* CreateStack(){//栈的创建 
	plstack* ptr1;
	ptr1=(plstack*)malloc(sizeof(plstack));
	if(ptr1!=NULL){
		ptr1->top=NULL;
	}
	else{
		printf("Out of place!\n");
	}
	return ptr1;
}

int IsEmptyStack(plstack* ptr1){//判断栈是否为空 
	if(NULL==ptr1->top){
		return 1;
	}
	else{
		return 0;
	}
}

void PushStack(plstack* ptr1,char c1){//压栈操作
	NODE* p;
	p=(NODE*)malloc(sizeof(NODE));
	if(NULL==p){
		printf("Out of space!\n");
	}
	else{
		p->c=c1;
		p->next=ptr1->top;
		ptr1->top=p;
	}
}

char PopStack(plstack* ptr1){//出栈并返回栈顶元素的值 
	int flag=IsEmptyStack(ptr1);
	if(1==flag){
		printf("Empty stack can not be popped!\n");
		return 0;
	}
	else{
		NODE* temp=ptr1->top;
    	ptr1->top=ptr1->top->next;
		char c2;
		c2=temp->c;
    	free(temp);
    	return c2;
	}
}

char GetStack(plstack* ptr1){//不出栈并返回栈顶元素的值 
	int flag;
	flag=IsEmptyStack(ptr1);
	if(1==flag){
		printf("Empty Stack has not top value!\n");
		return 0;
	}
	else{
		char c3;
		c3=ptr1->top->c;
		return c3;
	}
}
 
void Function(plstack* p_optr,char *sptr1,char *sptr2){
	for(;*sptr1!='\0';sptr1++){
		switch(*sptr1){
			case '\n':break;
			case '+':
			case '-':
			case '*':
			case '/':
			case '(':
			case ')':{
				if(p_optr->top==NULL){
					PushStack(p_optr,*sptr1);break;
				}
				char c1=p_optr->top->c;
				char c2=*sptr1;
            	if(('('!=c1)&&(')'==c2)){
            		for(;('('!=c1)&&(')'==c2);){
        				*sptr2=PopStack(p_optr);sptr2++;
						c1=p_optr->top->c;  			
					}
					sptr1--;
				}
				else if(('('==c1)&&(')'==c2)){
					PopStack(p_optr);
				}
				else if(('('==c1)||('('==c2)){
					PushStack(p_optr,*sptr1);
				}
				else if(('*'==c1)||('/'==c1)){
        			*sptr2=PopStack(p_optr);sptr2++;
        			sptr1--;
				}
				else if(('*'==c2)||('/'==c2)){
					PushStack(p_optr,*sptr1);
				}
				else{
        			*sptr2=PopStack(p_optr);sptr2++;
        			sptr1--;
				}
				break;
			}
			default:*sptr2=*sptr1;sptr2++;
		}
	}
	while(p_optr->top!=NULL){
		*sptr2=PopStack(p_optr);sptr2++;
	}
}

int main()
{
	char s1[100];
	char *sptr1=s1;
	fgets(sptr1,60,stdin);
	
	//创建 “运算符”栈 
	plstack* p_optr=CreateStack();
	
	//后缀表示式放在s2中 
	char s2[100]={0};
	char *sptr2=s2;
	Function(p_optr,sptr1,sptr2);
	printf("%s",s2);
	
	return 0;
}
举报

相关推荐

0 条评论