【データ構造】C言語スタックの実装

スタックの定義

片方の固定端でのみ要素の挿入と削除を許可する特別な線形テーブル。データの挿入および削除操作の一方の端はスタックの最上位と呼ばれ、もう一方の端はスタックの最下部と呼ばれます。

スタックの基本操作

押す:スタックの挿入操作はプッシュ、プッシュ、プッシュと呼ばれ、スタックにプッシュされたデータはスタックの一番上にあります。
スタックを解除する:スタックの削除操作は、ポップと呼ばれます。ポップされたデータもスタックの一番上にあります。
したがって、リンクリストとシーケンシャルリストを使用してスタックを実装できますが、スタックの構造を考慮すると、削除の終了と挿入の終了操作なので、シーケンステーブルを使用すると便利です。
ここに画像の説明を挿入します

スタックの実装

C言語シーケンステーブルの実装:

スタックの定義

typedef int Data;
typedef struct stack{
    
    
	Data* _data;
	int _size;
	int _capacity;
}stack;

スタックの初期化

void init(stack* stack){
    
    
	if (stack == NULL){
    
    
		return;
	}
	stack->_data = NULL;
	stack->_capacity = stack->_size = 0;
}

空(容量増加)

void checkcapacity(stack* stack){
    
    
	if (stack->_capacity==stack->_size){
    
    
		int newcapacity = stack->_capacity == 0 ? 1 : stack->_capacity * 2;
		stack->_data = (Data*)realloc(stack->_data,sizeof(Data)*newcapacity);
		stack->_capacity = newcapacity;
	}
}

ポップアンドプッシュ

//入栈(先进后出)(相当于尾插)
void push(stack* stack, Data data){
    
    
	if (stack == NULL){
    
    
		return;
	}
	checkcapacity(stack);
	stack->_data[stack->_size] = data;
	stack->_size++;
}

//出栈(相当于尾删)
void pop(stack* stack){
    
    
	if (stack == NULL){
    
    
		return;
	}
	if (stack->_size > 0){
    
    
		stack->_size--;
	}
}

トップ要素

//得到栈顶元素
void stacktop(stack* stack){
    
    
	//如果为空的话返回空,不用判断
	return stack->_data[stack->_size - 1];
}

空のスタック

//判断是否为空栈
int empty(stack* stack){
    
    
	if (stack->_size == 0){
    
    
		return 1;
	}
	else if (stack = NULL){
    
    
		return 1;
	}
	else{
    
    
		return 0;
	}
}

要素の数を見てください

int size(stack* stack){
    
    
	if (stack == NULL){
    
    
		return 0;
	}
	return stack->_size;
}

破壊

void destory(stack* stack)
{
    
    
	if (stack == NULL)
	{
    
    
		printf("非法操作\n");
		return;
	}
	stack->_size = 0;
	stack->_capicity = 0;
	free(stack->_data);//先释放堆空间
	stack->_data = NULL;

}

おすすめ

転載: blog.csdn.net/zhaocx111222333/article/details/114580813