栈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;
}