栈
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
- 基本结构
//------------栈的基本结构------------
struct Node //结点结构体
{
DataTyep info;
struct Node *next;
};
typedef struct Node Node, *PNode;
struct LinkStack //堆栈结构体
{
struct Node *top;
};
typedef struct LinkStack LinkStack, *PLinkStack;
- 初始化空栈
//创建空栈
PLinkStack createEmptyStack()
{
PLinkStack plstack;
plstack = (PLinkStack)malloc(sizeof(LinkStack));
if(plstack != NULL)
plstack->top = NULL;
else
printf("Create Error: Out of space!\n");
return plstack;
}
- 判断是否为空栈
//判断是否为空栈
int isEmptyStack(PLinkStack plstack)
{
return (plstack->top == NULL);
}
- 压栈
//将x压入栈中
void push(PLinkStack plstack, DataTyep x)
{
PNode p;
p = (PNode)malloc(sizeof(Node));
if(p == NULL)
printf("Push Error:Out of space!\n");
else
{
p->info = x;
p->next = plstack->top; //将栈中元素链到新结点之后
plstack->top = p; //top指向新插入的结点
}
}
- 出栈
//将栈顶元素弹出,返回值为空
void pop(PLinkStack plstack)
{
PNode p;
if(isEmptyStack(plstack))
printf("Error:Empty stack pop!\n");
else
{
p = plstack->top; //保存top结点
plstack->top = plstack->top->next; //top指向top->next
free(p); //释放掉原来的top结点
}
}
- 获取栈顶
//获取栈顶的元素
DataTyep top(PLinkStack plstack)
{
if(isEmptyStack(plstack))
printf("Error: Empty Stack!\n");
else
return plstack->top->info;
}
测试代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
using namespace std;
typedef char DataTyep;
//------------栈的基本结构------------
struct Node //结点结构体
{
DataTyep info;
struct Node *next;
};
typedef struct Node Node, *PNode;
struct LinkStack //堆栈结构体
{
struct Node *top;
};
typedef struct LinkStack LinkStack, *PLinkStack;
//创建空栈
PLinkStack createEmptyStack()
{
PLinkStack plstack;
plstack = (PLinkStack)malloc(sizeof(LinkStack));
if(plstack != NULL)
plstack->top = NULL;
else
printf("Create Error: Out of space!\n");
return plstack;
}
//判断是否为空栈
int isEmptyStack(PLinkStack plstack)
{
return (plstack->top == NULL);
}
//将x压入栈中
void push(PLinkStack plstack, DataTyep x)
{
PNode p;
p = (PNode)malloc(sizeof(Node));
if(p == NULL)
printf("Push Error:Out of space!\n");
else
{
p->info = x;
p->next = plstack->top; //将栈中元素链到新结点之后
plstack->top = p; //top指向新插入的结点
}
}
//将栈顶元素弹出,返回值为空
void pop(PLinkStack plstack)
{
PNode p;
if(isEmptyStack(plstack))
printf("Error:Empty stack pop!\n");
else
{
p = plstack->top; //保存top结点
plstack->top = plstack->top->next; //top指向top->next
free(p); //释放掉原来的top结点
}
}
//获取栈顶的元素
DataTyep top(PLinkStack plstack)
{
if(isEmptyStack(plstack))
printf("Error: Empty Stack!\n");
else
return plstack->top->info;
}
int main()
{
int i;
PLinkStack s = createEmptyStack();
for(i = 1; i <= 10; i++)
{
push(s, i);
}
for(i = 1; i <= 10; i++)
{
int x = top(s);
printf("%d\n", x);
pop(s);
}
return 0;
}