堆栈
数据对象集:有0个或多个元素的有穷线性表;
操作集:建立一个空栈;判断栈空;判断栈满;入栈;出栈并返回栈顶元素;
堆栈是有一定约束的线性表,这里的一定约束是指堆栈只在线性表的一端操作,后进先出。
堆栈的实现
数据类型以int为例,其余同理。错误值ERROR置为-1,在应用的时候应将这个值置为不可能在栈中出现的值,不然会出现错误。
顺序栈
#include<iostream>
#define ERROR -1
using namespace std;
const int maxn=105;
struct Stack
{
int* data;//数组指针
int top;//栈顶位置
int maxsize;//栈的容量
};
typedef struct Stack* S;
S CreateStack(int maxnum)//创建一个空栈
{
S s;
s=new Stack;
s->maxsize=maxnum;
s->data=new int[maxnum];
s->top=-1;
return s;
}
bool IsFull(S s)//判断栈满
{
return s->top==s->maxsize-1;
}
void Push(S s,int x)//入栈
{
if(IsFull(s))
{
cout<<"栈已满,无法进行入栈操作。"<<endl;
return ;
}
s->data[++(s->top)]=x;
return ;
}
bool IsEmpty(S s)//判断栈空
{
return s->top==-1;
}
int Pop(S s)//出栈并返回栈顶元素
{
if(IsEmpty(s))
{
cout<<"栈空,无法进行出栈操作。"<<endl;
return ERROR;
}
return s->data[(s->top)--];
}
void release(S s)
{
delete [](s->data);
delete s;
}
int main()
{
S s;
s=CreateStack(maxn);
int i;
for(i=0; i<10; ++i)
Push(s,i);
while(!IsEmpty(s))
cout<<Pop(s)<<" ";
cout<<endl;
release(s);
return 0;
}
链栈
链栈与顺序栈相比没有最大容量,所以在入栈的时候也不需要判断栈满。
#include<iostream>
#define ERROR -1
using namespace std;
const int maxn=105;
struct node
{
int data;
struct node* next;
};
typedef struct node* S;
S CreateStack()//创建一个空栈,有头结点
{
S head;
head=new node;
head->data=-1;
head->next=NULL;
return head;
}
void Push(S s,int x)//入栈
{
S t;
t=new node;
t->data=x;
t->next=s->next;
s->next=t;
}
bool IsEmpty(S s)//判断栈空
{
return s->next==NULL;
}
int Pop(S s)//出栈并返回栈顶元素
{
if(IsEmpty(s))
{
cout<<"栈空,无法进行出栈操作。"<<endl;
return ERROR;
}
S p;
p=s->next;//指向有数据的第一个结点
s->next=p->next;
int temp=p->data;
delete p;
return temp;
}
void release(S s)
{
while(!IsEmpty(s))
Pop(s);
delete s;
}
int main()
{
S s;
s=CreateStack();
int i;
for(i=0; i<10; ++i)
Push(s,i);
while(!IsEmpty(s))
cout<<Pop(s)<<" ";
cout<<endl;
release(s);
return 0;
}