数据结构(5) - 顺序栈
作者:互联网
顺序栈是栈的顺序实现。顺序栈是指利用顺序存储结构实现的栈。采用地址连续的存储空间(数组)依次存储栈中数据元素,由于入栈和出栈运算都是在栈顶进行,而栈底位置是固定不变的,可以将栈底位置设置在数组空间的起始处;栈顶位置是随入栈和出栈操作而变化的,故需用一个整型变量top来记录当前栈顶元素在数组中的位置。
sequence-stack.c
1 /** 2 * C data structure sequence stack example. 3 * 4 * License - MIT. 5 */ 6 7 #include "sequence-stack.h" 8 9 10 /** 11 * seqstack_isempty - Determine if the stack is empty. 12 */ 13 bool seqstack_isempty(LPSEQSTACK lpstack) 14 { 15 return (-1 == lpstack->top); 16 } 17 18 19 /** 20 * seqstack_isfull - Determine if the stack is full. 21 */ 22 bool seqstack_isfull(LPSEQSTACK lpstack) 23 { 24 return ((MAX_DATA_SIZE - 1) == lpstack->top); 25 } 26 27 28 /** 29 * seqstack_push - Push data to stack. 30 */ 31 int seqstack_push(LPSEQSTACK lpstack, int data) 32 { 33 /* Determine if sequential stack is full. */ 34 if (seqstack_isfull(lpstack)) 35 return -1; 36 37 /* Push data to stack. */ 38 lpstack->top++; 39 lpstack->data[lpstack->top] = data; 40 41 return 0; 42 } 43 44 45 /** 46 * seqstack_pop - Pop data from stack. 47 */ 48 int seqstack_pop(LPSEQSTACK lpstack, int *data) 49 { 50 /* Determine if sequential stack is empty. */ 51 if (seqstack_isempty(lpstack)) 52 return -1; 53 54 /* Pop data from stack. */ 55 *data = lpstack->data[lpstack->top]; 56 lpstack->top--; 57 58 return 0; 59 } 60 61 62 /** 63 * seqstack_init - Initialize sequence stack. 64 */ 65 int seqstack_init(LPSEQSTACK *lpHead) 66 { 67 /* Allocate memory space. */ 68 *lpHead = (LPSEQSTACK)malloc(sizeof(SEQSTACK)); 69 70 if (NULL == *lpHead) { 71 printf("Error in sequence stack init.\n"); 72 return -1; 73 } 74 75 (*lpHead)->top = -1; 76 77 return 0; 78 } 79 80 81 /** 82 * seqstack_clear - Clear sequence stack. 83 */ 84 int seqstack_clear(LPSEQSTACK lpHead) 85 { 86 int i = -1; 87 88 while (!seqstack_isempty(lpHead)) 89 { 90 seqstack_pop(lpHead, &i); 91 } 92 93 free(lpHead); 94 lpHead = NULL; 95 96 return 0; 97 }
sequence-stack.h
1 /** 2 * C data structure sequence list example. 3 * 4 * License - MIT. 5 */ 6 7 #ifndef __SEQ_STACK_H__ 8 #define __SEQ_STACK_H__ 9 10 11 #include <stdio.h> 12 #include <stdlib.h> 13 #include <stdbool.h> 14 15 #define MAX_DATA_SIZE 10 16 17 typedef struct _SEQSTACK { 18 int data[MAX_DATA_SIZE]; 19 int top; 20 } SEQSTACK, *LPSEQSTACK; 21 22 23 bool seqstack_isempty (LPSEQSTACK lpstack); 24 bool seqstack_isfull (LPSEQSTACK lpstack); 25 int seqstack_push (LPSEQSTACK lpstack, int data); 26 int seqstack_pop (LPSEQSTACK lpstack, int *data); 27 int seqstack_init (LPSEQSTACK *lpHead); 28 int seqstack_clear (LPSEQSTACK lpHead); 29 30 31 #endif /* __SEQ_STACK_H__ */
main.c
1 /** 2 * C data structure sequence stack example. 3 * 4 * License - MIT. 5 */ 6 7 #include <stdio.h> 8 #include <string.h> 9 10 #include "sequence-stack.h" 11 12 13 /** 14 * stack_test - Use stack test example. 15 */ 16 int stack_test(LPSEQSTACK lpHead, int buf[], int len) 17 { 18 int i = 0; 19 int data = 0; 20 21 printf("Push data: "); 22 23 for (i = 0; i < len; i++) { 24 seqstack_push(lpHead, buf[i]); 25 printf("%d ", buf[i]); 26 } 27 28 printf("\nPop data: "); 29 30 for (i = 0; i < len; i++) { 31 seqstack_pop(lpHead, &data); 32 printf("%d ", data); 33 } 34 35 printf("\n"); 36 37 return 0; 38 } 39 40 41 /** 42 * Main function. 43 */ 44 int main(void) 45 { 46 int buf[5] = {1, 2, 3, 4, 5}; 47 LPSEQSTACK seqhead = NULL; 48 49 seqstack_init(&seqhead); 50 51 stack_test(seqhead, buf, 5); 52 53 seqstack_clear(seqhead); 54 55 return 0; 56 }
Makefile:
1 # Makefile 2 CC = gcc 3 CFLAGS = -Wall -g -O0 4 5 SRC = main.c sequence-stack.c 6 7 OBJ = seqstack-test 8 9 $(OBJ) : $(SRC) 10 $(CC) $(CFLAGS) -o $@ $^ 11 12 clean: 13 $(RM) $(OBJ) *.o *.*.sw?
详细代码请参考Github: [Link] [https://github.com/Phoebus-Ma/C-Helper/tree/main/Class-1/Stack.C].
标签:seqstack,LPSEQSTACK,int,顺序,lpstack,数据结构,data,stack 来源: https://www.cnblogs.com/tinyshark/p/16411650.html