数据结构之栈和队列

第三章  栈和队列

一   栈

1  定义

栈是限定仅在表头进行插入和删除操作的线性表。

2  特点

先进后出。

3  实践

1  实现对用户输入的10进制数转化成其他进制并输出(十进制转八进制)

#define STACKSIZE 100
#define JIA_STACKSIZE 10

typedef int Status;
typedef int SElemtype;

typedef struct{
   SElemtype *base; //栈底
   SElemtype *top;  //栈顶
   int stacksize;   //栈当前的存储空间
}SStack;

int main()
{
	int N ;
	printf("请输入一个十进制整数:");
	scanf("%d",&N);
	convert(N);
	system("pause");
	return 0;
}

 //初始化
Status InitStack(SStack &S)
{
    S.base=(SElemtype *)malloc(STACKSIZE*sizeof(SElemtype)); //申请空间
    if(!S.base)  return 0;       //分配失败
    S.top=S.base;
    S.stacksize=STACKSIZE;
    return 1;
}
  //进栈(插入)
Status Push(SStack &S,SElemtype e)
{
  if(S.top-S.base>=S.stacksize) //判满
  {
	S.base=(SElemtype*)realloc(S.base,(S.stacksize+JIA_STACKSIZE)*sizeof(SElemtype));//分配空间
	if(!S.base)   return 0;   //分配失败
	S.top=S.base+S.stacksize;
	S.stacksize+=JIA_STACKSIZE;
  }
  *S.top=e;                //插入
  S.top++;
  return 1;
}
 //取栈顶元素
Status Getop(SStack S,SElemtype &e)
{
     if(S.top==S.base)  return 0;//判空
     e=*(S.top-1);        //取元素
     return 1;
}
//出栈(删除)
Status Pop(SStack &S, SElemtype &e)
{
   if(S.top==S.base)  return 0;  //判空
      S.top--;
   e=*S.top;//取出栈顶元素元素
return 1; } void convert(int N)//实现将十进制数n转换成8进制数字并输出 { SStack S; InitStack(S); int e; while(N) { Push(S,N%8); N/=8; } printf("转换的八进制数为:");
while(S.top!=S.base) { Pop(S,e); printf("%d",e); } }

2  计算用户输入的简单表达式的值:例如(5+2)*3     (输入的是字符,只限于十以内的运算)

typedef int SElemtype;
typedef int Status;

typedef struct   //定义栈
{
	SElemtype *base;
	SElemtype *top;
	int stacksize;
}Sqstack;

int main()
{
    char t;
    printf("请输入算术表达式,并以#结束\n");
    t=Evaluate();
    printf("运算结果是:%c",t);
    return 0;
}
Status InitStack(Sqstack &S)//初始化(数)
{
 	 S.base=(SElemtype *)malloc(100 * sizeof(SElemtype));//申请空间
 	 if(!S.base)   return 0;
 	 S.top=S.base;
 	 S.stacksize=100;
 	 return 0;
}

Status InitStack(Sqstack &S)//初始化(数)
{
 	 S.base=(SElemtype *)malloc(100 * sizeof(SElemtype));//申请空间
 	 if(!S.base)   return 0;
 	 S.top=S.base;
 	 S.stacksize=100;
 	 return 0;
}
Status Push(Sqstack &S,SElemtype e)//进栈
{
   if(S.top-S.base>=S.stacksize)  //判满
	 {
	 	 S.base=(SElemtype *)realloc(S.base,(S.stacksize+20)*sizeof(SElemtype));
	 	 if(!S.base)   return 0;
	 	 S.top = S.base + S.stacksize;
	 	 S.stacksize+=20;
	 }
	 *S.top++=e;
	 return 0;
}
Status Pop(Sqstack &S,SElemtype &e)//出栈
{
    if(S.top==S.base)   return 0;
    e=*--S.top;
    return 0;
}
Status Gettop(Sqstack S)//取栈顶元素
{
	SElemtype e;
	if(S.top==S.base)   return 0;
	e=*(S.top-1);    
	return e;
}
Status Evaluate()//表达式求值
{
	 Sqstack OPTR,OPND;
	 SElemtype C,theta,x,a,b;
	 InitStack(OPTR); 
	 InitStack(OPND); 
	 Push(OPTR,'#');
	 C=getchar();
	 while(C!='#'||Gettop(OPTR)!='#')
	 {
	 	  if(C>='0'&&C<='9')
			{
				Push(OPND,C);
				C=getchar();
			} //if
			else
			{
				switch(Precede((Gettop(OPTR)),C))
			  {
				   case'<':
					       Push(OPTR,C);C=getchar();
					       break;
				   case'=':
					       Pop(OPTR,x);C=getchar();
					       break;
				   case'>':
					       Pop(OPTR,theta);
					       Pop(OPND,b);
					       Pop(OPND,a);
					       Push(OPND,(Operate(a,theta,b)));
					       break;
				   case' ':
					       printf("输入的多项式不正确,请重新输入");
					       break;
			  } //switch
			}
	 } //while
	 return Gettop(OPND);
}
Status Precede(SElemtype a,SElemtype b)//优先级函数
{
	 int t,p;
	 SElemtype code[7][7]={'>','>','<','<','<','>','>',
	                       '>','>','<','<','<','>','>',
	                       '>','>','>','>','<','>','>',
	                       '>','>','>','>','<','>','>',
	                       '<','<','<','<','<','=',' ',
	                       '>','>','>','>',' ','>','>',
	                       '<','<','<','<','<',' ','='};
		switch(a)
		{
			 case '+':  t=0; break;
			 case '-':  t=1; break;
			 case '*':  t=2; break;
			 case '/':  t=3; break;
			 case '(':  t=4; break;
			 case ')':  t=5; break;
			 case '#':  t=6; break;
		}//switch
		switch(b)
		{
			 case '+':  p=0; break;
			 case '-':  p=1; break;
			 case '*':  p=2; break;
			 case '/':  p=3; break;
			 case '(':  p=4; break;
			 case ')':  p=5; break;
			 case '#':  p=6; break;
		}//switch
        return code[t][p];
}
Status Operate(SElemtype a,SElemtype c,SElemtype b)//运算函数
{
   a=a-48;
   b=b-48;
   switch(c)
   {
   	  case '+': return a+b+48;
   	  case '-': return a-b+48;
   	  case '*': return a*b+48;
   	  case '/':
   	  	   if(b!=0)  return a/b+48;
		   else
                   {
                      printf("除数不能为0!\n");
                       return 0;
		   }
   }//switch
   return 0;
}

  

 

二   队列

1  定义

 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

2  特点

 先进先出。

 

posted @ 2018-02-06 23:26  ~欢  阅读(215)  评论(0编辑  收藏  举报