1. 程式人生 > >資料結構之棧(Stack)的關於C語言的實現

資料結構之棧(Stack)的關於C語言的實現

C語言實現棧共有兩種方法,一種是使用陣列的包含最大Size的棧,另外一種是運用連結串列的方法實現

關於陣列方法實現的程式碼如下:

#include<stdio.h>
/**
 * Your MinStack struct will be instantiated and called as such:
 * struct MinStack* obj = minStackCreate(maxSize);
 * minStackPush(obj, x);
 * minStackPop(obj);
 * int param_3 = minStackTop(obj);
 * int param_4 = minStackGetMin(obj);
 * minStackFree(obj);
 */

typedef struct {
	int * data;
	int Top;
	int MaxSize;
    
} MinStack, * pStack;

/** initialize your data structure here. */
MinStack* minStackCreate(int maxSize) {
   pStack s= (pStack)malloc(sizeof(MinStack));
   s->data=(int)malloc(maxSize * sizeof(int));
   s->Top=-1;
   s->MaxSize=maxSize;
   return s;  
}

void minStackPush(MinStack* obj, int x) {
    obj->Top++;
	obj->data[obj->Top]=x;
}

void minStackPop(MinStack* obj) {
  obj->Top--;  
}

int minStackTop(MinStack* obj) {
    return obj->data[obj->Top];
}

int minStackGetMin(MinStack* obj) {
	int i=0;
	int re=obj->data[0];
    for(i=0;i<=obj->Top;i++){
		if(obj->data[i]<re){
			re=obj->data[i];
		}
	}
	return re;
}

void minStackFree(MinStack* obj) {
	int i=0;
    for(i=0;i<obj->Top;i++){
		free(obj->data[i]);
	}
	free(obj);
	obj=NULL;
}


int main(void){
	 struct MinStack* obj = minStackCreate(5);
	 minStackPush(obj,-2);
	 minStackPush(obj,0);
	 minStackPush(obj,-3);
	 printf("%d\n",minStackGetMin(obj));
	 minStackPop(obj);
	 printf("%d\n",minStackTop(obj));
	 printf("%d\n",minStackGetMin(obj));
	 
	 

	
}

關於連結串列的方法實現棧的程式碼如下:

#include<stdio.h>
/**
 * Your MinStack struct will be instantiated and called as such:
 * struct MinStack* obj = minStackCreate(maxSize);
 * minStackPush(obj, x);
 * minStackPop(obj);
 * int param_3 = minStackTop(obj);
 * int param_4 = minStackGetMin(obj);
 * minStackFree(obj);
 
 */
typedef struct {
	int data;
	struct MinStack * next;
    
} MinStack , * Stack;

/** initialize your data structure here. */
MinStack* minStackCreate(int maxSize) {
    Stack head = (Stack)malloc(sizeof(MinStack));
	head->next=NULL;
	return head;
}

void minStackPush(MinStack* obj, int x) {
    Stack snew= (Stack)malloc(sizeof(MinStack));
	snew->data=x;
	snew->next=obj->next;
	obj->next=snew;
	
}

void minStackPop(MinStack* obj) {
    Stack q = (Stack)malloc(sizeof(MinStack));
	q=obj->next;
	obj->next=obj->next->next;
	free(q);
	q=NULL;
}

int minStackTop(MinStack* obj) {
    return obj->next->data;
}

int minStackGetMin(MinStack* obj) {
	Stack p=obj;
    int re=obj->next->data;
	while(p!=NULL){
		if(p->data<re){
			re=p->data;
		}
		p=p->next;
	}
}

void minStackFree(MinStack* obj) {
    while(obj!=NULL){
		Stack p=obj->next;
		free(obj);
		obj=p;
		
		
	}
}


int main(void){
	struct MinStack* obj = minStackCreate(10);
	int x=0;
	minStackPush(obj,-2);
	minStackPush(obj,0);
	minStackPush(obj,-3);
	x=minStackGetMin(obj);
	printf("%d",x);
	minStackPop(obj);
	x=minStackTop(obj);
	printf("%d",x);
	x=minStackGetMin(obj);
	printf("%d",x);
	
	
}