数据结构——栈的应用

#include <malloc.h>
#include <stdio.h> 

typedef char ElemType;

//----- 栈的顺序存储表示 -----
#define MaxSize 50
typedef struct 
{
	ElemType data[MaxSize]; 
    int top;		//栈顶指针
}SqStack;

void InitStack(SqStack *&s)
{  
	s=(SqStack *)malloc(sizeof(SqStack));
    s->top=-1;
} 
void DestroyStack(SqStack *&s)
{
	free(s);
}
bool StackEmpty(SqStack *s)
{
	return(s->top==-1);
}
bool Push(SqStack *&s,ElemType e)
{
	if (s->top==MaxSize-1)  //栈满的情况,即栈上溢出
		return false;
    s->top++;		   //栈顶指针增1
    s->data[s->top]=e;	   //元素e放在栈顶指针处
    return true;
}
bool Pop(SqStack *&s,ElemType &e)
{
    if (s->top==-1)	//栈为空的情况,即栈下溢出
		return false;
    e=s->data[s->top];	//取栈顶指针元素的元素
    s->top--;		//栈顶指针减1
    return true;
}
bool GetTop(SqStack *s,ElemType &e)
{
	if (s->top==-1)	//栈为空的情况,即栈下溢出    
    	return false;
    e=s->data[s->top];	//取栈顶指针元素的元素
    return true;
}
int StackLength(SqStack *s)
{
	return s->top+1;
}

void DispStack(SqStack *S)
{
//	printf("\n栈长为:%d",StackLength(S)); 
//	printf("\n当前栈为:");
	
	for(int i=0;i<StackLength(S);i++)
	{
		printf("%c ",S->data[i]);  
	}

}

实验1

编制一个满足下列要求的程序:对于输入的任意一个非负十进制数,打印输出与其等值的二进制数。(十进制 → 二进制)
在这里插入图片描述

void conversion () 
{
	SqStack *S;
	int N,e;	
	InitStack(S); 
	printf("请输入十进制数N:");
    scanf ("%d",&N);
    while(N) 
    {
          Push(S, N%2);
          N = N/2;
    }
//    DispStack(S);
    printf("对应的二进制是:");
    while (!StackEmpty(S))
    {
          Pop(S,e);
          printf ("%d", e );
    }
} 

实验2

设计一个程序用于检测输入的符号是否匹配,如果不匹配则输出提示并退出。

匹配成功:
匹配成功
匹配失败:

在这里插入图片描述
在这里插入图片描述

typedef int Status;
#define TRUE 1 
#define FALSE 0

Status Match_Brackets()
{   

	SqStack *S,*T;
	InitStack(S);
	InitStack(T);
	
	char inputch,e;
	
	int ItemNum;
	printf("请输入字符个数:"); 
	scanf("%d",&ItemNum);
	
	printf("请输入字符:");
	for(int i=0;i<=ItemNum;i++)     //因为要处理回车,长度加1 
	{	
		scanf("%c",&inputch);
		if(inputch != 0x0a)    //0x0a是回车符 
		{
			Push(T,inputch);    //保存输入的字符	
		}
				
		switch(inputch)
		{
			case '(':
				Push(S,inputch); 
				break;
			case '[':
				Push(S,inputch); 
				break;
			case ')':
				Pop(S,e); 
         		if(e != '(')
        		{  
					printf("'('括号不匹配"); 
            	    return FALSE;  
				}
				break;
			case ']':
				Pop(S,e); 
         		if(e != '[')
        		{  
					printf("'['括号不匹配"); 
          	      	return FALSE;  
				}
				break;
		} 
	}    	
    if(!StackEmpty(S)) 
	{    
		printf("\n\n括号数量不匹配!") ;
      	return FALSE;
	}
	else
	{
		printf("\n\n成功匹配!"); 
		DispStack(T);
		return TRUE; 
	}			
}

实验3

设计一个算法,用于检测给定的字符串是否为对称串。
在这里插入图片描述
在这里插入图片描述

bool symmetry(ElemType str[])
{  
	int i;  
	ElemType e;
    SqStack *st;
    InitStack(st);			//初始化栈
    for (i=0;str[i]!='\0';i++)	//将串所有元素进栈
		Push(st,str[i]);		//元素进栈

	printf("给定的串是:"); 
	DispStack(st);
	
    for (i=0;str[i]!='\0';i++)
    {
		Pop(st,e);		  //退栈元素e
		if (str[i]!=e)	  //若e与当前串元素不同则不是对称串
		{  
			DestroyStack(st);//销毁栈
	   		return false;
		}
   }
   DestroyStack(st);	  //销毁栈
   return true;
}

主函数

int main(int argc, char** argv) {

//*实验内容1 
	conversion () ;	

//*实验内容2		
//	Match_Brackets();


/*实验内容3 
	char a[10]={'a','b','c','d','e','e','d','c','b','a'};
	bool result=symmetry(a);
	if(result == true)
	{
		printf("\n\n该串是对称串");
	}
	else
	{
		printf("\n\n该串不是对称串");
	} 
//*/	
	
	return 0;
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值