栈 —— 链式存储
链栈:
链栈结构的定义:
链栈即栈的链式存储,这里用带头结点的单链表实现链栈
1 typedef int StackElemType; 2 typedef struct node { 3 StackElemType data; 4 struct node* next; 5 }LinkStackNode,*LinkStack;
链栈初始化:
1 /*初始化链栈*/ 2 LinkStack initLinkStack() { 3 LinkStack ls = (LinkStackNode*)malloc(sizeof(LinkStackNode)); 4 ls->next = NULL; 5 return ls; 6 }
链栈进栈操作:
1 /*链栈压入元素*/ 2 int push(LinkStack top,StackElemType e) { 3 LinkStackNode* temp = (LinkStackNode*)malloc(sizeof(LinkStackNode)); 4 /*判断申请空间是否成功*/ 5 if (temp==NULL) 6 { 7 return false; 8 } 9 //将元素e存入到结点 10 temp->data = e; 11 //将结点存入到链栈中 12 temp->next = top->next; 13 top->next = temp; 14 return true; 15 }
链栈出栈操作:
1 /*链栈弹出元素*/ 2 int pop(LinkStack top,StackElemType *e) { 3 LinkStackNode* temp; 4 temp = top->next; 5 /*判断链栈是否为空*/ 6 if (temp==NULL) 7 { 8 return false; 9 } 10 //存储删除的元素 11 *e = temp->data; 12 //元素出栈,栈顶指向出栈元素的下一个结点 13 top->next = temp->next; 14 /*释放存储空间*/ 15 free(temp); 16 return true; 17 }
获取栈顶元素:
1 /*获取栈顶元素*/ 2 StackElemType getStackTop(LinkStack top) { 3 //判断栈是否为空 4 if (top->next == NULL) { 5 return false; 6 } 7 return (top->next->data); 8 }
置空链栈:
1 /*置空栈*/ 2 void setStackNULL(LinkStack top) { 3 LinkStackNode* s, * p; 4 p = top->next; 5 while (p!=NULL) 6 { 7 s = p; 8 free(s); 9 p = p->next; 10 } 11 top->next = NULL; 12 }
打印链栈内的元素:
1 /*打印链栈内的元素*/ 2 void printfListStack(LinkStack top) { 3 LinkStackNode* p; 4 p = top->next; 5 while (p != NULL) { 6 printf("%d ", p->data); 7 p = p->next; 8 } 9 printf("\n"); 10 }
主函数:
1 int main() { 2 LinkStack ls = initLinkStack(); 3 StackElemType e; 4 push(ls, 2); 5 push(ls, 4); 6 push(ls, 6); 7 printf("进栈元素:"); 8 printfListStack(ls); 9 10 int num = getStackTop(ls); 11 printf("获取栈顶元素:%d \n", num); 12 13 pop(ls, &e); 14 printf("出栈的元素:%d\n", e); 15 printf("栈内元素:"); 16 printfListStack(ls); 17 18 printf("置空链栈:"); 19 setStackNULL(ls); 20 printfListStack(ls); 21 22 return 0; 23 }