⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 对比.c

📁 对比程序原代码,是数据结构学习中必须掌握的程序制作
💻 C
字号:
#include<stdio.h>
#include<stdlib.h>
#define stackinitfir 100
typedef struct
{
   int *base;
   int *top;
   int stacksize;
}sqstack1;//
                  
typedef struct
{
   char *base;
   char *top;
   int stacksize;
}sqstack2;//
                 
void initstack1(sqstack1 *s)
{
  s->base=(int*)malloc(stackinitfir *sizeof(int));
  if(s->base) 
  s->top=s->base;
  s->stacksize=stackinitfir;
}//构造空栈(存储整形)。

void initstack2(sqstack2 *s)
{
  s->base=(char*)malloc(stackinitfir *sizeof(char));
  if(s->base) 
  s->top=s->base;
  s->stacksize=stackinitfir;
}//构造空栈(存储字符)。

void push1(sqstack1 *s,int e)
{

  *(*s).top++=e;
  
}//插入整形元素e为栈顶元素。

void push2(sqstack2 *s,char e)
{

  *(*s).top++=e;
}//插入字符元素e为栈顶元素。

int pop1(sqstack1 *s)
{
  int e;
  if((*s).top==(*s).base) return -1;
  e=*--(*s).top;
  return e;
}//删除栈顶整形元素并返回其值。

char pop2(sqstack2 *s)
{ 
  int e;
  if((*s).top==(*s).base) return -1;
  e=*--(*s).top;
  return e;
}//删除栈顶字符元素并返回其值。

int gettop1(sqstack1 *s)
{ int e;
  if((*s).top==(*s).base) return -1;
  e=*((*s).top-1);
  return e;
}//用e返回栈顶整形元素。

char gettop2(sqstack2 *s)
{ char e;
  if((*s).top==(*s).base) return -1;
  e=*((*s).top-1);
  return e;
}//用e返回栈顶字符元素。

int in(char c)
{
  if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#') 
	  return 1;
  else 
	  return 0;
}//是运算符则返回1,负责返回0.

char precede(char a,char b)
{
   int i,j;
   char str[9][9]={ ' ','+','-','*','/','(',')','#','^',
                   '+','>','>','<','<','<','>','>','<',
                   '-','>','>','<','<','<','>','>','<',
                   '*','>','>','>','>','<','>','>','<',
                   '/','>','>','>','>','<','>','>','<',
                   '(','<','<','<','<','<','=',' ','<',
                   ')','>','>','>','>',' ','>','>','>',
                   '#','<','<','<','<','<',' ','=','<',
                   '^','>','>','>','>','<','>','>','>',
               };
   for(i=0;i<9;i++)
    if(str[0][i]==b)                                
       break;
  for(j=0;j<9;j++)                                    
   if(str[j][0]==a)
    break;
   return str[j][i];
}//判断算符优先级。

int operate(int a,char c,int b)
{
  int d=a;
  d=0;
  if(c=='+') d=a+b;
  else if(c=='-') d=a-b;
  else if(c=='*') d=a*b;
  else d=a/b;
  return d;
}//计算a(c)b的值。

void evaluateexpression(sqstack2 *OPTR,sqstack1 *OPND)      
{
	char c,d,x,theta;
	int a,b;
	char str[10000]; 
	printf("请输入一个中缀表达式:\n");
	initstack2(OPTR);
	initstack1(OPND);
	push2(OPTR,'#');
	c=getchar();

    while(c!='#'||gettop2(OPTR)!='#')
	{

		if(!in(c))
		{
			for(i=1;i<=10000;i++)
              str[i]=c;t=str[i]

			//push1(OPND,c-48);
			c=getchar();
		
		}
		else 
			switch(precede(gettop2(OPTR),c))
		{
			case '<':
				push2(OPTR,c);
				c=getchar();
			
				break;
			case '=':
			    x=pop2(OPTR);
				c=getchar();
			
				break;
			case '>':
				theta=pop2(OPTR);
				b=pop1(OPND);
				a=pop1(OPND);
				push1(OPND,operate(a,theta,b));
				break;
		}
	}  
	printf("中缀法求值的结果为:\n");
	printf("%d\n",gettop1(OPND));
}//中缀法求值。

/*void infixtopostfix(sqstack2 *OPTR,sqstack1 *OPND)
{	
	char c,x,theta;	
	printf("请输入一个中缀表达式:\n");
	getchar();
	initstack1(OPND);
	initstack2(OPTR);
	push2(OPTR,'#');
	c=getchar();
    while(c!='#'||(gettop2(OPTR)!='#'))
	{
		if(!in(c))
		{
			printf("%c",c);
			push1(OPND,c);
			c=getchar();

		}
       else switch(precede(gettop2(OPTR),c))
			{	
			
			case '<': push2(OPTR,c);c=getchar();break;
			case '=': x=pop2(OPTR);c=getchar();break;
			case '>': theta=pop2(OPTR);printf("%c",theta);break;
		}
	}
	printf("\n");
}//将中缀法转化为后缀法。

void evaluateexpression_postfix(sqstack2 *OPTR,sqstack1 *OPND)
{	
	int a,b;
	char c;	
	printf("请输入一个后缀表达式:\n");
	initstack1(OPND);
	initstack2(OPTR);
	push2(OPTR,'#');
	c=getchar();
	while(c!='#')
	{
		if(!in(c))
		{
	     	push1(OPND,c-48);
            c=getchar();
		}
        else {
		b=pop1(OPND);
		a=pop1(OPND);
	    push1(OPND,operate(a,c,b)); 
		c=getchar();
		}  
	}
	printf("后缀法求值的结果为:\n");
	printf("%d\n",gettop1(OPND));
}//后缀法求值。*/

void main()
{
	sqstack1 p,*OPND;
	sqstack2 q,*OPTR;
	OPND=&p;
	OPTR=&q;
	evaluateexpression(OPTR,OPND);
	//infixtopostfix(OPTR,OPND);
	//evaluateexpression_postfix(OPTR,OPND);
}//主函数。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -