Es gibt drei Möglichkeiten, den Stapel zu implementieren: 1. Statischer Array-Stack, der eine feste Länge der Struktur erfordert und die Länge zur Kompilierungszeit bestimmt werden muss; , die Länge kann zur Laufzeit bestimmt und geändert werden. 3. Kettenstrukturstapel, keine Länge online, beantragen Sie bei Bedarf die Zuweisung von Speicherplatz.
Es gibt drei Möglichkeiten, den Stapel zu implementieren:
1 Array-Stack
In einem statischen Array-Stack stellt den maximalen Wert der Elemente dar, die der Stack speichern kann. Verwenden Sie STACK_SIZE
als Array-Index, um die Elemente im Stack darzustellen 🎜> Der Stapel ist leer; wenn top_element
bedeutet dies, dass der Stapel voll ist. Beim Drücken erhöht sich top_element == -1
um 1, wenn top_element == STACK_SIZE - 1
das erste Stapelelement darstellt, verringert sich top_element
um 1. top_element == 0
top_element
a_stack.c-Quellcode lautet wie folgt:
[cpp] view plain copy /* ** ** 静态数组实现堆栈程序 a_stack.c ,数组长度由#define确定 */ #include"stack.h" #include<assert.h> #include<stdio.h> #define STACK_SIZE 100 /* 堆栈最大容纳元素数量 */ /* ** 存储堆栈中的数组和一个指向堆栈顶部元素的指针 */ static STACK_TYPE stack[STACK_SIZE]; static int top_element = -1; /* push */ void push(STACK_TYPE value) { assert(!is_full()); /* 压入堆栈之前先判断是否堆栈已满*/ top_element += 1; stack[top_element] = value; } /* pop */ void pop(void) { assert(!is_empty()); /* 弹出堆栈之前先判断是否堆栈已空 */ top_element -= 1; } /* top */ STACK_TYPE top(void) { assert(!is_empty()); return stack[top_element]; } /* is_empty */ int is_empty(void) { return top_element == -1; } /* is_full */ int is_full(void) { return top_element == STACK_SIZE - 1; } /* ** 定义一个print函数,用来打印堆栈里面的元素。 */ void print(void) { int i; i = top_element; printf("打印出静态数组堆栈里面的值: "); if(i == -1) printf("这是个空堆栈\n"); while(i!= -1) printf("%d ",stack[i--]); printf("\n"); } int main(void) { print(); push(10); push(9); push(7); push(6); push(5); push(4); push(3); push(2); push(1); push(0); printf("push压入数值后:\n"); print(); printf("\n"); pop(); pop(); printf("经过pop弹出几个元素后的堆栈元素:\n"); print(); printf("\n"); printf("top()调用出来的值: %d\n",top()); return 1; }
Das Ergebnis ist wie folgt:
2. Dynamisch Array-StackDie Header-Datei verwendet weiterhin
. Es werden nicht viele Änderungen vorgenommen. Die Variable wird hinzugefügt, um die Länge des Arrays zu speichern durch einen Zeiger. Der Standardwert ist unter globalen Variablen 0. stack.h
stack_size
STACK_SIZE
Die Funktion prüft zunächst, ob der Stack erstellt wurde, bevor sie die erforderliche Speichermenge zuweist und prüft, ob die Zuweisung erfolgreich war.
und create_stack
wurde eine Assertion hinzugefügt, um zu verhindern, dass Stapelfunktionen aufgerufen werden, bevor der Stapel erstellt wird. destroy_stack
is_empty
is_full
Der Quellcode lautet wie folgt:
[cpp] view plain copy /* ** 动态分配数组实现的堆栈程序 d_stack.c ** 堆栈的长度在创建堆栈的函数被调用时候给出,该函数必须在任何其他操作堆栈的函数被调用之前条用。 */ #include"stack.h" #include<stdio.h> #include<malloc.h> #include<assert.h> /* ** 用于存储堆栈元素的数组和指向堆栈顶部元素的指针 */ static STACK_TYPE *stack; static int stack_size; static int top_element = -1; /* create_stack */ void create_stack(size_t size) { assert(stack_size == 0); stack_size = size; stack = (STACK_TYPE *)malloc(stack_size * sizeof(STACK_TYPE)); if(stack == NULL) perror("malloc分配失败"); } /* destroy */ void destroy_stack(void) { assert(stack_size > 0); stack_size = 0; free(stack); stack = NULL; } /* push */ void push(STACK_TYPE value) { assert(!is_full()); top_element += 1; stack[top_element] = value; } /* pop */ void pop(void) { assert(!is_empty()); top_element -= 1; } /* top */ STACK_TYPE top(void) { assert(!is_empty()); return stack[top_element]; } /* is_empty */ int is_empty(void) { assert(stack_size > 0); return top_element == -1; } /* is_full */ int is_full(void) { assert(stack_size > 0); return top_element == stack_size - 1; } /* ** 定义一个print函数,用来打印堆栈里面的元素。 */ void print(void) { int i; i = top_element; printf("打印出动态数组堆栈里面的值: "); if(i == -1) printf("这是个空堆栈\n"); while(i!= -1) printf("%d ",stack[i--]); printf("\n"); } int main(void) { create_stack(50); print(); push(10); push(9); push(7); push(6); push(5); push(4); push(3); push(2); push(1); push(0); printf("push压入数值后:\n"); print(); printf("\n"); pop(); pop(); printf("经过pop弹出几个元素后的堆栈元素:\n"); print(); printf("\n"); printf("top()调用出来的值: %d\n",top()); destroy_stack(); return 1; }
Das Ergebnis ist wie folgt: d_stack.c
3. Kettenstapel
Da nur auf das oberste Element des Stapels zugegriffen werden kann, kann ein verknüpfter Stapel einfach mithilfe einer einfach verknüpften Liste implementiert werden, und es gibt keine Längenbeschränkung. Das Verschieben eines Elements auf den Stapel erfolgt durch Hinzufügen eines Elements zum Kopf der verknüpften Liste. Das Entfernen eines Elements erfolgt durch Löschen des ersten Elements am Anfang der verknüpften Liste. Da es keine Längenbeschränkung gibt, ist die Funktion nicht erforderlich und
wird benötigt, um den Speicher freizugeben, um Speicherlecks zu vermeiden.create_stack
Die Header-Datei destroy_stack
bleibt unverändert und der
[cpp] view plain copy /* ** 单链表实现堆栈,没有长度限制 */ #include"stack.h" #include<stdio.h> #include<malloc.h> #include<assert.h> #define FALSE 0 /* ** 定义一个结构以存储堆栈元素。 */ typedef struct STACK_NODE { STACK_TYPE value; struct STACK_NODE *next; } StackNode; /* 指向堆栈中第一个节点的指针 */ static StackNode *stack; /* create_stack */ void create_stack(size_t size) {} /* destroy_stack */ void destroy_stack(void) { while(!is_empty()) pop(); /* 逐个弹出元素,逐个释放节点内存 */ } /* push */ void push(STACK_TYPE value) { StackNode *new_node; new_node = (StackNode *)malloc(sizeof(StackNode)); if(new_node == NULL) perror("malloc fail"); new_node->value = value; new_node->next = stack; /* 新元素插入链表头部 */ stack = new_node; /* stack 重新指向链表头部 */ } /* pop */ void pop(void) { StackNode *first_node; assert(!is_empty()); first_node = stack; stack = first_node->next; free(first_node); } /* top */ STACK_TYPE top(void) { assert(!is_empty()); return stack->value; } /* is_empty */ int is_empty(void) { return stack == NULL; } /* is_full */ int is_full(void) { return FALSE; } /* ** 定义一个print函数,用来打印堆栈里面的元素。 */ void print(void) { StackNode *p_node; p_node = stack; printf("打印出链式堆栈里面的值: "); if(p_node == NULL) printf("堆栈为空\n"); while(p_node != NULL) { printf("%d ", p_node->value); p_node = p_node->next; } printf("\n"); } int main(void) { print(); push(10); push(9); push(7); push(6); push(5); push(4); push(3); push(2); push(1); push(0); printf("push压入数值后:\n"); print(); printf("\n"); pop(); pop(); printf("经过pop弹出几个元素后的堆栈元素:\n"); print(); printf("\n"); printf("top()调用出来的值: %d\n",top()); destroy_stack(); return 1; }
stack.h
Das Ergebnis ist wie folgt: l_stack.c
Empfohlenes Tutorial: „Java-Video-Tutorial
“Das obige ist der detaillierte Inhalt vonAuf wie viele Arten kann ein Stack implementiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!