抽象数据类型允许用户在不了解数据类型在计算机中的表示方式的情况下操作数据类型。换句话说,就用户而言,他需要知道的只是可以对数据类型执行的操作。实现数据类型的人可以自由地更改其实现,而不会影响用户。
作为一个线性列表的堆栈,其中的项在一端添加并从同一端删除。这一想法是由一个放在桌子上的“一叠盘子”来说明的,一个放在另一个上面。当需要一个盘子时,它从栈顶取下。当一个盘子被清洗时,它被添加到堆栈的顶部。请注意,如果现在需要一个盘子,那么这个“最新”的盘子就是所取的盘子。堆栈显示“后进先出”属性。
堆栈就是一种抽象数据类型。
栈的应用场景(保存暂时不用的数据或存储地址):I 软件撤销功能,浏览器后退、前进功能;II 括号匹配、表达式求值;III 数制转换;IV 函数调用、递归调用;V 辅助其它数据结构,如二叉树遍历;VI 迷宫求解;
堆栈可以用链表实现,也可以用数组实现:
1 用结构体来定义栈(当然类是一种更好的抽象数据类型)
typedef struct {int top;//记录数组下标位置int ST[MaxStack];} StackType, *Stack;
2 栈初始化
Stack initStack() {Stack sp = (Stack) malloc(sizeof(StackType));sp -> top = -1;return sp;}
3 用初始来定义一个栈变量
Stack S = initStack();
4 判断栈是否为空
int empty(Stack S) {return (S -> top == -1);}
5 在栈顶增加元素
void push(Stack S, int n) {if (S -> top == MaxStack - 1) {printf("Stack Overflow");exit(1);}++(S -> top);//下标移动S -> ST[S -> top] = n;}
如做以下操作:
push(S,3);push(S,36);push(S,15);push(S,52);push(S,23);
6 在栈顶删除元素
int pop(Stack S) {if (empty(S)) return RogueValue; //a symbolic constantint hold = S -> ST[S -> top];--(S -> top);//下标移动return hold;}
完整代码:
#include #include #define RogueValue -9999#define MaxStack 10typedef struct {int top;int ST[MaxStack];} StackType, *Stack;Stack initStack();int empty(Stack);void push(Stack, int);int pop(Stack);int main() {int n;Stack S = initStack();printf("Enter some integers, ending with 0");scanf("%d