栈是限定仅在表尾进行插入或者删除操作的线性表。因此对于栈来说,表尾端有其特殊含义,称为栈顶,表头端称为栈底,不含元素的栈称为空栈。
说明下,栈在编程中的使用频率挺高的。今天看到一个项目经理写的框架,里面大量使用到栈。
栈主要有两种形式:1.用数组实现,称为静态栈,地址是连续的。2.用链表实现,称为动态栈,地址不连续。
这次,我们以动态栈为例来讲栈。
首先,我们来看栈的结构
在这里,我只定义了一个顶部指针。
下面是代码
#pragma once #include<iostream> using namespace std; typedef int Elemtype; typedef struct Node { Elemtype elem; struct Node *next; }Node,*SNode; typedef struct { SNode top; }S, *Stack; Stack init_Stack(){ Stack s; if ((s = (Stack)malloc(sizeof(Stack)))) { s->top = NULL; } return s; } void push_Stack(Stack S, Elemtype elem) { SNode p; if (!(p = (SNode)malloc(sizeof(SNode)))) cout << "内存分配失败!" << endl; p->elem = elem; p->next = S->top; S->top = p; } void Create_Stack(Stack S) { Elemtype elem=1 ; while (elem) { cout << "Please enter the element you wanna push:"; cin >> elem; if (elem)push_Stack(S, elem); } } void Traverse_Stack(Stack S) { SNode p; p = S->top; while (p!=NULL) { cout << p->elem << " "; p = p->next; } cout << endl; } void pop_Stack(Stack S) { if (S->top == NULL)cout << "This is a empty stack!" << endl; else S->top = S->top->next; } #include"Stack.h" void main() { Stack S; S = init_Stack(); Create_Stack(S); Traverse_Stack(S); pop_Stack(S); Traverse_Stack(S); system("pause"); } 运行结果: