标签:有一个 取出 typedef 手机 inf 一个 http str 技术分享
栈,线性表的一种特殊的存储结构。与学习过的线性表的不同之处在于栈只能从表的固定一端对数据进行插入和删除操作,另一端是封死的。
栈存储结构调取栈中数据元素时,要避免出现“上溢”和“下溢”的情况:
“上溢”:在栈已经存满数据元素的情况下,如果继续向栈内存入数据,栈存储就会出错。
“下溢”:在栈内为空的状态下,如果对栈继续进行取数据的操作,就会出错。
栈的“上溢”和“下溢”,可以总结为:栈满还存会“上溢”,栈空再取会“下溢”。
对于栈的两种表示方式来说,顺序栈两种情况都有可能发生;而链栈由于“随时需要,随时申请空间”的存储结构,不会出现“上溢”的情况。
#include <stdio.h>
//元素elem进栈 int push(char *a, int top, char elem)
{ a[++top] = elem; return top; }
//数据元素出栈 int pop(char *a, int top)
{ if (top == -1)
{ printf("空栈"); return -1; } printf("弹栈元素:%c\n", a[top]); top--; return top; }
int main()
{ char a[100]; int top = -1; top=push(a, top, ‘a‘); top=push(a, top, ‘b‘); top=push(a, top, ‘c‘); top=push(a, top, ‘d‘); top=pop(a, top); top=pop(a, top); top=pop(a, top); top=pop(a, top); top=pop(a, top); return 0; }
输出结果:
弹栈元素:d
弹栈元素:c
弹栈元素:b
弹栈元素:a
空栈
链栈,用线性表的链式存储结构实现。
链栈一般不需要创建头结点,头结点会增加程序的复杂性,只需要创建一个头指针就可以了。
用链表表示栈时,用链表头结点的一端作为栈的栈顶端,这样做的好处是当数据元素压栈或者弹栈时,直接使用头指针就可以完成,不需要增设额外的指针。
例如,用链栈实现将(’a’,’b’,’c’,’d’)四个数据元素压栈,再依次弹栈:
#include <stdio.h> #include <stdlib.h>
typedef struct lineStack
{ char data; struct lineStack *next; }lineStack;
lineStack* push(lineStack * stack,char a)
{ lineStack *line = (lineStack*)malloc(sizeof(lineStack)); line->data = a; line->next = stack; stack = line; return stack; }
lineStack *pop(lineStack *stack)
{ if (stack)
{ lineStack *p = stack; stack = stack->next; printf("弹栈元素:%c ", p->data); if (stack)
{ printf("栈顶元素:%c\n", stack->data); }
else
{ printf("栈已空\n"); } free(p); }
else
{ printf("栈内没有元素"); return stack; }
return stack; }
int main()
{ lineStack *stack = NULL; stack = push(stack, ‘a‘); stack = push(stack, ‘b‘); stack = push(stack, ‘c‘); stack = push(stack, ‘d‘); stack = pop(stack); stack = pop(stack); stack = pop(stack); stack = pop(stack); stack = pop(stack);
return 0; }
输出结果:
弹栈元素:d 栈顶元素:c
弹栈元素:c 栈顶元素:b
弹栈元素:b 栈顶元素:a
弹栈元素:a 栈已空
栈内没有元素
实际生活中使用手机时,屏幕页面的跳转使用的就是栈结构(跳转页面时,前一个页面会被存储到栈中;做回退操作时会回到上一个页面,这是进栈页面出栈的效果)。另外在求 n!时,可以通过函数的递归来实现,这个过程的底层就用到了栈结构。
除此之外,数制转换和括号匹配问题也可以用栈来解决(下节介绍)。
标签:有一个 取出 typedef 手机 inf 一个 http str 技术分享
原文地址:https://www.cnblogs.com/ciyeer/p/9031068.html