栈的基本操作及 两个小应用

栈Stack的基本操作及 两个小应用 栈的特点先进后出 **

Stack.h 文件

**

#ifndef  __STACK_H__
#define __STACK_H__

enum B00I{FALSE,TRUE}; 

typedef struct stack{
	char *pbuff;
	int icapa;
	int itop;
}Stack;

//初始化 
int StackInit(Stack *stack,int cap);
//销毁 
void StackDestory(Stack *stack);
//清空
void StackClear (Stack *stack);
//判空 
int StackIsEmpty(Stack *stack);
//判满 
int StackIsFull(Stack *stack);
//获取栈的大小 
int StackSize(Stack *stack);
//入栈 
int push(Stack *stack,char e);
//获取栈顶元素 
int gettop(Stack *stack,char * ret);
//出栈
int pop(Stack *stack,char *ret);

#endif

Stack.c 文件

#include <stdio.h>
#include <stdlib.h>

#include "Stack.h"
// 初始化
int StackInit(Stack *stack,int cap){
	stack->pbuff=malloc(sizeof(char)*cap);
	if(stack->pbuff==NULL)
	 return FALSE;
	 
	stack->icapa=cap;
	stack->itop=0;
	return TRUE;
}
//销毁
void StackDestory(Stack *stack){
	free(stack->pbuff);
	stack->icapa=0;
	stack->itop=0;
}
//清空
void StackClear (Stack *stack){
	stack->itop=0;
} 

//判空 
int StackIsEmpty(Stack *stack){
	int ret=(stack!=NULL);
	ret=ret&&(stack->itop==0);
	return ret;
}
//判满 
int StackIsFull(Stack *stack){
	return stack->itop==stack->icapa;
}
//获取栈的大小 
int StackSize(Stack *stack){
	return stack->itop;
}
//入栈 
int push(Stack *stack,char e){
	if(StackIsFull(stack)) {
		printf("栈满");
		return FALSE;
	}
	stack->pbuff[stack->itop++] =e;
	return TRUE;

}
//获取栈顶元素 
int gettop(Stack *stack,char * ret){
	if(StackIsEmpty(stack)){
	//	printf("栈空");
		return FALSE; 
	}
	*ret=stack->pbuff[stack->itop-1];
	return TRUE;
}
//出栈
int pop(Stack *stack,char *ret){
	if(StackIsEmpty(stack)){
		printf("栈空");
	    return FALSE; 
	}

	*ret=stack->pbuff[--stack->itop];     
	return TRUE;
} 

converse.c 文件

//栈的应用1-进制转换 十进制转为其他进制

void converse(unsigned int data,int base){
	char *buf="0123456789ABCDEF";
	Stack stack;
	StackInit(&stack, 50);
	
	do{
		push(&stack,buf[data%base]);
		data/=base;
	}while(data!=0);
	
	while(!StackIsEmpty(&stack)){
		char ret;
		pop(&stack,&ret);
		printf("%c",ret);
	}
	printf("\n");
	StackDestory(&stack);
}

check.c 文件

***//栈的应用2-判断括号是否正确 匹配 ***

#include <stdio.h>
#include <stdlib.h>

#include "Stack.h"

void check(const char *str){
	Stack stack;
	StackInit(&stack,100);
	int flag=1;
	
	int i;
	for(i=0;str[i]!='\0';i++){
	
		if(str[i]=='('||str[i]=='['||str[i]=='{'){          // 如果是做符号 { [ (,入栈
			push(&stack,str[i]);
		}else if(str[i]==')'||str[i]==']'||str[i]=='}'){     // 如果是右括号 }]) ,弹出栈顶元素,进行比较 
			char elem;
			if(pop(&stack,&elem)==FALSE){      //没有左括号入栈的情况下 就有了右括号 
				printf("错误:无相应的左括号与\'%c\'匹配错误\n",str[i]); 
				flag=0;
				break;          
			}else if(elem=='('&&str[i]==')'||elem=='['&&str[i]==']'||elem=='{'&&str[i]=='}'  ){
		    		continue;                                 //成功匹配 继续下一个字符 
			}else {    //不匹配 
				printf("\'%c\' 与\'%c\'不匹配 \n",elem,str[i]);
				flag=0;
				break;
			}
	    }else{
	    	 //普通字符什么也不做 
		} 
   }
   
   if(flag)
     printf("没有错误\n");
   
}

main.c 文件

#include <stdio.h>
#include <stdlib.h>

#include "Stack.h"


int main() {
	Stack stack;
	StackInit(&stack,5);
	int i;
	for(i=0;i<5;i++){
		push(&stack,'A'+i);
	}
	printf("is full : %d\n", StackIsFull(&stack));  //结果为 : 1
	printf("size    : %d\n", StackSize(&stack));    //结果为 :5
	printf("is empty: %d\n", StackIsEmpty(&stack)); //结果为 : 0(FALSE)
	while(!StackIsEmpty(&stack)){
		char ret;
		pop(&stack,&ret);
		printf("%c ",ret);
	}                                  //结果为 :E D C B A
	printf("\n");
	
	
	printf("-----------------------\n");
	converse(17,16);    //结果为11 
	converse(16,8);     //结果为20 
	converse(123,16);   //结果为7B 
	
    printf("-----------------------\n");
	char *arr1="void main(){}";   //无错误 
	char *arr2="void main}(){}";   //"错误:无相应的左括号与%c匹配错误\n
	char *arr3="void main(){)}";   //{与)不匹配
	check(arr1);
	check(arr2);
	check(arr3);
	
	return 0;
}


运行结果截图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值