详解C语言之堆栈
程序员文章站
2022-07-03 22:49:42
目录一、何为堆栈?二、思维导图三、代码1、顺序堆栈2、链式堆栈总结一、何为堆栈?a.堆栈是一种特殊的线性表b.堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其不同点是:线性表允许在任意位置插...
一、何为堆栈?
a.堆栈是一种特殊的线性表
b.堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其不同点是:线性表允许在任意位置插入和删除数据元素,但堆栈只允许在固定一端进行插入和删除数据元素,所以栈又称为“先进后出”(filo)或“后进先出”(lifo)的线性表
c.堆栈中允许进行插入和删除数据元素的一端称为栈顶,另一端称为栈底
d.堆栈的插入操作通常称为进栈或入栈;堆栈的删除操作通常称为出栈或退栈
二、思维导图
三、代码
1、顺序堆栈
#include <stdio.h> typedef int datatype; #define maxstacksize 64 typedef struct { datatype stack[maxstacksize]; int top; }seqstack; //初始化 void stackinit(seqstack *s) { s->top = 0; } //判断是否栈空 int stackisempty(seqstack s) { if (s.top <= 0) return 0; else return 1; } //入栈 int stackpush(seqstack *s, datatype x) { if (s->top >= maxstacksize) { printf("栈满,无法进栈!!!\n"); return 0; } else { s->stack[s->top] = x; s->top++; return 1; } } //出栈 int stackpop(seqstack *s, datatype *x) { if (s->top <= 0) { printf("堆栈已空,无法出栈!!!\n"); return 0; } else { s->top--; *x = s->stack[s->top]; return 1; } } //获取栈顶元素 int stackgettop(seqstack s, datatype *x) { if (s.top <= 0) { printf("堆栈已空!!!\n"); return 0; } else { *x = s.stack[s.top - 1]; return 1; } } int main() { seqstack mystack; int i, x; stackinit(&mystack); for (i = 0; i < 10; i++) stackpush(&mystack, i + 1); stackgettop(mystack, &x); printf("当前栈顶元素为:%d\n", x); printf("依次出栈:"); while (stackisempty(mystack)) { stackpop(&mystack, &x); printf("%d ", x); } system("pause"); return 0; }
2、链式堆栈
#include <stdio.h> #include <stdlib.h> typedef int datatype; typedef struct snode { datatype data; struct snode *next; }lsnode; //初始化 void stackinit(lsnode **top) { *top = (lsnode *)malloc(sizeof(lsnode)); (*top)->next = null; } //判断堆栈是否非空 int stackisempty(lsnode *top) { if (top->next == null) return 0; else return 1; } //入栈 void stackpush(lsnode *top, datatype x) { lsnode *p; p = (lsnode *)malloc(sizeof(lsnode)); p->data = x; p->next = top->next; top->next = p; } //出栈 int stackpop(lsnode *top, datatype *x) { lsnode *p = top->next; if (p == null) { printf("堆栈已空,删除错误!!!\n"); return 0; } top->next = p->next; *x = p->data; free(p); return 1; } //获取栈顶元素 int stackgettop(lsnode *top, datatype *x) { lsnode *p = top->next; if (p == null) { printf("堆栈已空,取出错误!!!\n"); return 0; } *x = p->data; return 1; } //释放内存空间 void stackdestroy(lsnode **top) { lsnode *p, *q; p = *top; while (p != null) { q = p; p = p->next; free(q); } *top = null; } int main() { int i, x; lsnode *top; stackinit(&top); for (i = 0; i < 10; i++) stackpush(top, i + 1); stackgettop(top, &x); printf("当前栈顶元素为%d\n", x); printf("依次出栈:"); while (stackisempty(top)) { stackpop(top, &x); printf("%4d", x); } stackdestroy(&top); system("pause"); return 0; }
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!
上一篇: 目光停留在两腿之间