OJ之栈的基本使用

``` 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的功能**
- **对传入参数要做空值判断**


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


## 代码如下





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值