栈
**栈( stack)是一种重要的线性结构,它是受限的线性表,是仅能在表的一端进行插入和删除运算的线性表,栈被广泛的运用到各种系统的程序设计中。
**
(1)通常称插入、删除的一端为栈顶,另一端称为栈底。
(2)当表中没有元素时称为空栈。
(3)栈为后进先出的线性表。
栈的修改是按熙后进先出的原则进行。每次删除(退栈)的总是当前栈中“最新”的元素,即最后插入(进栈)的元素,而最先插入的则是被放在栈的底部,要到最后才能删除。
栈的基本运算
在实际使用过程中,常用的栈的操作如下。
- InitStack(S):构造一个空栈S。
(2) StackEmpty(S):判断是否为空栈。若S为空栈,则返回TRUE,香则返回 FALSE - Stack Ful(S):判断是否为满栈。若S为满栈,则返回TRUE,否则返回 FALSE。
4)push(S,x):进栈,若栈S不满,则将元素x插入S的的栈顶。
5)pop(S):出栈。若栈S非空,则将S的栈顶元素删去,并返回元素。
(6) Stack Top(S):取栈顶元素。若栈S非空,则返回栈顶元素,但不改变栈的状态
顺序栈的定义
顺序栈的定义和顺序表的定义一样,通常使用结构体定义顺序栈,记录栈顶坐标,从而操作栈实现各种功能
#define Stacksize 100 //假设与分配的栈空间最多为100个元素
typedef struct
{
char date[Stacksize];//假设栈元素的数据类型为字符
int top;//定义栈顶
}Seqstack;
注意:
(1)栈底位置是固定不变的,可设置在栈的任意一个端点。
(2)栈顶位置是随着进栈和出栈的操作而变化的,用一个整型量top(通常称top为栈顶指针)来指示当前栈顶的位置。
链式栈
栈的链式存储结构称为链栈。链栈是没有附加头结点的运算受限的单链表。栈顶指针就是链表的头指针。跟单链表一样,通常使用结构体实现链式栈的功能,结构体内一个量存储结点值,一个量存储指针,实现链式结构。就像单链表有头指针一样,也为链式栈定义头结点,以便对链式栈进行操作。
typedef struct stacknode//链式栈表结构
{
char date;
struct stacknode *next;//栈元素指针
}StackNode;
typedef struct
{
stackNode *top;//栈顶指针
}linkStack;
代码走起:
#include <stdio.h>
#include <stdlib.h>
#define len sizeof(node)//申请空间大小
//定义栈结构的结点
typedef struct stack_node {
char element;
struct stack_node *next;
} node;
typedef struct {
node *top;
} stack;
//进栈函数
void push(stack *sp, char element) {
node *np;
//创建新节点
np = (node *)malloc(len);
np->element = element;
//修改栈顶指针
np->next = sp->top;
sp->top = np;
}
//出栈函数
char pop(stack *sp) {
node *np;//将要出栈的结点指针
np = sp->top;
char c;//栈顶元素值
c = np->element;
sp->top = np->next;
free(np);
np = NULL;
return c;
}
//遍历输出函数
void read (stack sp) {
stack temstack = {NULL};
char tem;
while (sp.top != NULL) {
tem = pop(&sp);
printf("%c\n", tem);
push(&temstack, tem);
}
while (temstack.top != NULL) {
tem = pop(&temstack);
push(&sp, tem);
}
}
int main() {
stack s = {NULL};
push(&s, 'a');
push(&s, 'b');
push(&s, 'c');
read(s);
return 0;
}
希望对大家有帮助哦
