``` c
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "oj.h"
#define stackLength 50
struct std_stack{
int top; //栈中元素个数,同时给出最高点位置
void * data[stackLength]; //栈数据,data作为指针,每个地址存放的是放入数据的地址
};
Stack* stack_create()
{
//First: initialize the strcture of stack and get Address
Stack * 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 null
if(self==NULL) return NULL;
//First: judge the top element exist
if(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 null
if(self==NULL)
return NULL;
//judge whether exists top object
if(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;
else
return 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的功能**
- **对传入参数要做空值判断**
-------------------
## 代码如下