OJ之栈的基本使用

来源:互联网 发布:自行车大全软件 编辑:程序博客网 时间:2024/06/07 00:20
``` c#include <stdlib.h>#include <string.h>#include <stdio.h>#include "oj.h"#define stackLength 50struct std_stack{int  top; //栈中元素个数,同时给出最高点位置void * data[stackLength]; //栈数据,data作为指针,每个地址存放的是放入数据的地址};Stack* stack_create(){//First: initialize the strcture of stack and get AddressStack * stack = (Stack*)malloc(sizeof(Stack));stack->top = 0;for(int i=0; i<stackLength; i++)stack->data[i] = NULL;return stack;}void stack_distory(Stack* self, void (*free_object)(void* object)){if(self==NULL) return;if(free_object==NULL) return;for(int i=0; i<self->top; i++){if(self->data[i]!=NULL){for(int j=i+1; j<self->top; j++){if(self->data[i]== self->data[j])self->data[j] = NULL;}free_object(self->data[i]);}}free_object(self);return;}void stack_clear(Stack* self){if(self==NULL) return;//从栈顶指针开始pop元素while(!stack_empty(self)){stack_pop(self);}return;}void stack_push(Stack* self, void* data){//首先判断栈指针是否越界,即栈大小是否合理if(self == NULL) return;if(data == NULL)return;self->data[self->top] = data;self->top++;return;}void* stack_pop(Stack* self){//if stack is nullif(self==NULL) return NULL;//First: judge the top element existif(self->top == 0)return NULL;else{void * result = self->data[self->top-1];self->top--;self->data[self->top] = NULL;return result;}return NULL;}void* stack_peek(Stack* self){//judge stack whether nullif(self==NULL)return NULL;//judge whether exists top objectif(self->top == 0)return NULL;else{return self->data[self->top-1];}return NULL;}boolean stack_empty(Stack* self){if(self==NULL) return true;if(self->top !=0 )return false;elsereturn true;}int stack_search(Stack* self, void* data, boolean (*match)(void* data)){if(self == NULL ) return -1;if(data == NULL && match == NULL) return -1;if(match == NULL) {int pos = 0;for(int i=0; i<self->top; i++){if(0 == strcmp((char*)(self->data[i]),(char *)(data))){pos = (self->top - i);}}/*while(!stack_empty(self)){pos++;char* data1 = (char *)stack_peek(self);if(0==strcmp(data1,(char*)data))return pos;stack_pop(self);}*/if(pos == 0) return -1;else return pos;}else{int pos = 0;//if(data == NULL) return -1;for(int i=0; i<self->top; i++){if(match(self->data[i])){pos = (self->top - i);}}if(pos == 0) return -1;else return pos;}return -1;}```

# 栈的基本使用


此题关键点如下:


- **定义一个栈的基本结构体**
- **理解stack_search的功能**
- **对传入参数要做空值判断**


-------------------


## 代码如下





0 0