顺序栈与链栈

来源:互联网 发布:Linux web根目录 编辑:程序博客网 时间:2024/06/04 19:36

顺序栈是指利用顺序存储结构实现的栈。用一个数组来顺序存储栈中元素,一个整型变量top来记录当前栈顶元素在数组中的位置。

1.结点类型

#define maxlen 100

typedef struct{

    Datatype data[maxlen];

    int top;

}SeqStack;

2.置空栈算法

SeqStack *InitStack(SeqStack *S){

    S->top=-1;

    return S;

}

3.建空栈算法

SeqStack *SetStack(){

    SeqStack *S;

    S=(SeqStack *)malloc(sizeof(SeqStack));

    S->top=-1;

    return S;

}

4.判栈空算法

//栈空返回1,不空返回0

int StackEmpty(SeqStack *S){

    if(S->top>=0)

        return 0;

    else

        return 1;

}

5.判栈满算法

//栈满返回1,不满返回0

int StackFull(SeqStack *S){

     if(S->top<=maxlen&&S->top>=0)

        return 0;

    else

        return 1;

}

6.取栈顶元素算法

Datatype Gettop(SeqStack *S){

     if(S->top<=maxlen&&S->top>=0)

        return(S->datat[S->top]);

    else

        printf("Error!");

}

7.入栈算法

void Push(SeqStack *S,Datatype x){

    if(S->top<maxlen-1&&S->top>=-1){

        S->top++;

         S->data[S->top]=x;

    }

    else

        printf("Error!");

}

8.出栈算法

void Pop(SeqStack *S){

    if(S->top>=0)

        S->top--;

    else

        printf("Error!");

}


其中,栈顶位置  S->top

            栈底元素  S->data[0]

            栈底元素  S->data[S->top]



下面为实现顺序栈的基本操作


#include<stdio.h>
#include<malloc.h>
#define maxlen 100


typedef struct{
int data[maxlen];
int top;
}SeqStack;


//创建空栈并初始化
SeqStack *InitStack(){
SeqStack *S;
S=(SeqStack *)malloc(sizeof(SeqStack));
S->top=-1;
return S;
}
//判断栈满算法
int StackFull(SeqStack *S){
if(S->top<maxlen-1&&S->top>-1)
printf("此栈未满!\n");
else
printf("此栈已满!\n");
return 0;
}
//取栈顶元素算法
int GetTop(SeqStack *S){
if(S->top<maxlen-1&&S->top>=0)
return (S->data[1]);
else
printf("取栈顶元素失败!\n");
// return 0;
}
//元素入栈算法
void Push(SeqStack *S,int x){
if(S->top<maxlen-1&&S->top>=-1){
S->top++;
S->data[S->top]=x;
}
else
printf("入栈失败!\n");
}
//元素出栈算法
void Pop(SeqStack *S){
if(S->top>-1){
S->top--;
printf("此时栈顶元素是:%d\n",S->data[S->top]);
printf("栈长:%d\n",S->top+1);
}
else
printf("出栈失败!\n");
}
//操作运行
int main(){
SeqStack *S;
int x,i;
int A,len;
printf("建立一个空栈并且初始化!\n");
S=InitStack();
    printf("现在建立一个空栈\n请输入栈的长度:");
scanf("%d",&len);
for(i=0;i<len;i++){
printf("输入入栈的元素:\n");
scanf("%d",&x);
Push(S,x);
printf("入栈后的栈顶元素为:%d\n",S->data[S->top]);
    printf("栈长:%d\n",S->top+1);
}


printf("判断顺序栈是否为满?\n");
StackFull(S);
printf("取栈顶元素:\n");
A=GetTop(S);
printf("此时的栈顶元素是%d\n",A);
printf("元素出栈\n");
Pop(S);
return 0;
}


链栈

链栈是指采用链接存储结构实现的栈。栈中每一个元素单独占用相应大小的存储空间,每个存储存储单元在存储中元素ai的同时,也存储其逻辑后继ai+1的存储地址;所有存储单元可以占用连续或不连续的存储区域,也称每个存储单元为链栈中的结点。其中,data域是数据域,用来存放数据元素ai的值,next域是指针域,用来存放ai的直接后继ai+1的存储地址。




下面为实现顺序栈的基本操作



#include<stdio.h>
#include<malloc.h>
#define maxlen 100


typedef struct{
int data[maxlen];
int top;
}SeqStack;


//创建空栈并初始化
SeqStack *InitStack(){
SeqStack *S;
S=(SeqStack *)malloc(sizeof(SeqStack));
S->top=-1;
return S;
}
//判断栈满算法
int StackFull(SeqStack *S){
if(S->top<maxlen-1&&S->top>-1)
printf("此栈未满!\n");
else
printf("此栈已满!\n");
return 0;
}
//取栈顶元素算法
int GetTop(SeqStack *S){
if(S->top<maxlen-1&&S->top>=0)
return (S->data[1]);
else
printf("取栈顶元素失败!\n");
// return 0;
}
//元素入栈算法
void Push(SeqStack *S,int x){
if(S->top<maxlen-1&&S->top>=-1){
S->top++;
S->data[S->top]=x;
}
else
printf("入栈失败!\n");
}
//元素出栈算法
void Pop(SeqStack *S){
if(S->top>-1){
S->top--;
printf("此时栈顶元素是:%d\n",S->data[S->top]);
printf("栈长:%d\n",S->top+1);
}
else
printf("出栈失败!\n");
}
//操作运行
int main(){
SeqStack *S;
int x,i;
int A,len;
printf("建立一个空栈并且初始化!\n");
S=InitStack();
    printf("现在建立一个空栈\n请输入栈的长度:");
scanf("%d",&len);
for(i=0;i<len;i++){
printf("输入入栈的元素:\n");
scanf("%d",&x);
Push(S,x);
printf("入栈后的栈顶元素为:%d\n",S->data[S->top]);
    printf("栈长:%d\n",S->top+1);
}


printf("判断顺序栈是否为满?\n");
StackFull(S);
printf("取栈顶元素:\n");
A=GetTop(S);
printf("此时的栈顶元素是%d\n",A);
printf("元素出栈\n");
Pop(S);
return 0;
}


顺序队列-主要是循环队列

#include<stdio.h>
#include<malloc.h>
#define maxlen 100


typedef struct{
int data[maxlen];
int front;
int rear;
}SeqQueue;


//建立空循环队列
SeqQueue *SetQueue(){
SeqQueue *Q;
Q=(SeqQueue *)malloc(sizeof(SeqQueue));
Q->front=0;
Q->rear=0;
printf("空循环队列已建立!\n");
return Q;
}


//判队满算法
int QueueFull(SeqQueue *Q){
if(Q->front==(Q->rear+1)%maxlen)
return 1;
else
return 0;
}


//判队空算法
int QueueEmpty(SeqQueue *Q){
if(Q->front==Q->rear)
return 1;
else
return 0;
}


//入队算法
void Add(SeqQueue *S,int x){
if(!QueueFull(Q)){
Q->rear=(Q->rear+1)%maxlen;
Q->data[Q->rear]=x;
}
else
printf("Queue full!\n");
}


//出队算法
void Delete(SeqQueue *S){
if(!QueueEmpty(Q))
Q->front=(Q->front+1)%maxlen;
else
printf("Queue empty!\n");
}



运行代码如下:

#include<stdio.h>
#include<malloc.h>
#define maxlen 100


typedef struct{
int data[maxlen];
int front;
int rear;
}SeqQueue;


//建立空循环队列
SeqQueue *SetQueue(){
SeqQueue *Q;
Q=(SeqQueue *)malloc(sizeof(SeqQueue));
Q->front=0;
Q->rear=0;
printf("空循环队列已建立!\n");
return Q;
}


//判队满算法
int QueueFull(SeqQueue *Q){
if(Q->front==(Q->rear+1)%maxlen){
printf("此循环队列已满!\n");
return 1;
}
else{
printf("此循环队列未满!\n");
return 0;
}
}


//判队空算法
int QueueEmpty(SeqQueue *Q){
if(Q->front==Q->rear){
printf("此循环队列为空!\n");
return 1;
}
else{
printf("此循环队列不为空!\n");
return 0;
}
}


//入队算法
void Add(SeqQueue *Q,int x){
if(!QueueFull(Q)){
Q->rear=(Q->rear+1)%maxlen;
Q->data[Q->rear]=x;
printf("元素入队成功!\n");
}
else
printf("Queue full!\n");
}


//出队算法
void Delete(SeqQueue *Q){
if(!QueueEmpty(Q)){
Q->front=(Q->front+1)%maxlen;
printf("元素出队成功!\n");
}
else{
printf("Queue empty!\n");
}
}


int main(){
SeqQueue *S;
int len,i,x;
int s;
printf("建立一个循环队列\n");
    S=SetQueue();
printf("输入队列长度:");
scanf("%d",&len);
printf("请输入需要入队的元素:\n");
for(i=1;i<=len;i++){
scanf("%d",&S->data[i]);
S->rear++;//这个一定不能忘。front和rear两个指针是判断依据!
}
scanf("%d",&x);
Add(S,x);
printf("判断循环队列是否已满?\n");
s=QueueFull(S);
printf("出队\n");    
    Delete(S);
return 0;
}


运行结果如图: