栈的存储结构有两种:一种是线性栈,一种是链式栈。下面分别是这两种存储结构的实现。
线性栈:
#define STACK_INIT_SIZE 10 #define STACK_REALLOCATION 2 typedef int ElemType; typedef struct SqStack { ElemType *base; int top; int stacklength; }SqStack; void InitSqStack(SqStack *S) { S->base = (ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType)); if (!S->base) exit(1); S->top = 0; S->stacklength = STACK_INIT_SIZE; } void Push_SqStack(SqStack *S,ElemType e) { if (S->top == S->stacklength){ S->base = (ElemType*)realloc(S->base,(S->stacklength +STACK_REALLOCATION)*sizeof(ElemType)); if (!S->base) exit(1); S->stacklength += STACK_REALLOCATION; } S->base[S->top] = e; ++S->top; } int Pop_SqStack(SqStack *S, ElemType *e) { if (S->top == 0) return 0; --S->top; *e = S->base[S->top]; return 1; } int GetTopElem_SqStack(SqStack *S, ElemType *e) { if (S->top == 0) return 0; *e = S->base[S->top-1]; return 1; } int isSqStackEmpty(SqStack S) { if (S.top == 0) return 1; else return 0; } void SqStack_test() { SqStack S; InitSqStack(&S); ElemType e; printf("Please input some numbers(Ctrl + Z to end).\n"); while (scanf("%d", &e) != EOF) Push_SqStack(&S,e); printf("The out stack sequence is:\n"); while (!isSqStackEmpty(S)){ Pop_SqStack(&S,&e); printf("%d ",e); } printf("\n"); } int main() { SqStack_test(); return 0; }
链式栈:
#include <stdio.h> #include <stdlib.h> #define STACK_INIT_SIZE 10 #define STACK_REALLOCATION 2 typedef int ElemType; typedef struct LinkStack { ElemType data; struct LinkStack *next; }StackNode,*StackPNode; StackPNode InitLinkStack() { StackPNode head = (StackPNode)malloc(sizeof(StackNode)); if (!head) exit(1); head->next = NULL; head->data = 0; return head; } void Push_LinkStack(StackPNode head, ElemType e) { StackPNode node = (StackPNode)malloc(sizeof(StackNode)); if (!node) exit(1); node->data = e; node->next = NULL; node->next = head->next; head->next = node; } int Pop_LinkStack(StackPNode head, ElemType *e) { StackPNode p; if (!head->next) return 0; //StackPNode p; //StackPNode p; //struct LinkStack *p; p= head->next; *e=p->data; head->next = p->next; free(p); return 1; } int isLinkStackEmpty(StackPNode head) { if (head->next) return 0; else return 1; } int getTopElem_LinkStack(StackPNode head,ElemType *e) { if (head->next) return 0; *e = head->next->data; return 1; } void LinkStack_test() { StackPNode head = InitLinkStack(); ElemType e; printf("Please input some numbers(Ctrl + Z to end).\n"); while (scanf("%d", &e) != EOF) Push_LinkStack(head,e); printf("The out stack sequence is:\n"); while (!isLinkStackEmpty(head)){ Pop_LinkStack(head, &e); printf("%d ", e); } printf("\n"); } int main() { LinkQueueTest(); return 0; }
原文地址:http://blog.csdn.net/nyist327/article/details/29420841