c语言实现栈与链栈

首先是栈的c语言代码

#include <stdio.h>
#include <stdlib.h>
#define MAX 100//数组最大空间
typedef struct
{
    char *array;
    int top;
    int maxsize;//等于MAX
}stack;



int isFull(stack *L)
{
    return (L->top == L->maxsize-1);//栈满返回1,否则返回0
}

int isempty(stack *L)
{
    return (L->top==-1);//栈为空返回1,否则返回0
}


void initialize(stack *L)//初始化顺序栈
{
    L->top=-1;
    L->maxsize=MAX;
    L->array=(char*)malloc(sizeof(char)*MAX);
    if(!L->array)//L->array=NULL
        exit(1);
}

char Top(stack *L)//返回栈顶元素的值
{
    if(isempty(L))
        exit(1);
    else
        return L->array[L->top];
}

void push(stack *L,char e)//压栈
{
    int i;
    if(isFull(L))
    {
        char *oldarr=L->array;
        L->array=(char *)malloc(sizeof(char)*2*L->maxsize);//重新分配2倍的空间
        for(i=0;i<=L->top;i++){
            L->array[i]=oldarr[i];
        }
        L->maxsize=2*L->maxsize;
        free(oldarr);
    }
    L->array[++L->top]=e;
}

void pop(stack *L)
{
    if(L->top==-1){
        exit(1);
    }
    L->top--;
};


void clear(stack*L)
{
    L->top=-1;
}

void destory(stack*L)
{
    free(L->array);
}

int main()
{
    stack S;
    char ctemp;
    int i;
    initialize(&S);//初始化栈

    printf("输入8个字符,按输入顺序进栈:");
    for(i=1;i<=8;i++){
        ctemp=getchar();
        push(&S,ctemp);
    }

    printf("逐个出栈:");
    while(!isempty(&S))
    {
        ctemp=Top(&S);
        pop(&S);
        printf("%c",ctemp);
    }
    printf("\n");
    destory(&S);
    return 0;
}

下面的是链栈代码

#include <stdio.h>
#include <stdlib.h>
typedef char elemType;
typedef struct
{
    char data;
    struct Node*next;
}Node;

typedef struct
{
    Node *Top;//代表栈顶
}linkstack;


void initialize(linkstack *s)//初始化栈,使其为空栈
{
    s->Top=NULL;
}

int isempty(linkstack *s)//栈为空返回1,否则返回0
{
    return (s->Top==NULL);
}

char top(linkstack *s)
{
    if(!s->Top)//栈空
        exit(1);
    return (s->Top->data);
}

void push(linkstack *s,char e)
{
    Node *temp=(Node*)malloc(sizeof(Node));

    temp->data=e;
    temp->next=s->Top;

    s->Top=temp;//链入栈
}

void pop(linkstack *s)
{
    Node*temp;
    if(!s->Top)
        exit(1);
    temp=s->Top;
    s->Top=s->Top->next;

    free(temp);
}


void clear(linkstack *s)
{
    Node *temp;
    temp=s->Top;
    while(temp)
    {
        s->Top=s->Top->next;
        free(temp);
        temp=s->Top;
    }
}


int main()
{
    linkstack s;
    char ctemp;
    int i;
    initialize(&s);

    printf("输入8个字符,依次进栈: ");
    for(i=1;i<=8;i++)
    {
        ctemp=getchar();
        push(&s,ctemp);
    }

    printf("将栈中结点逐个出栈: ");
    while(!isempty(&s))
    {
        ctemp=top(&s);
        pop(&s);
        putchar(ctemp);
    }
    printf("\n");
    return 0;
}

这里的话主要也就是代码,因为仔细看也不难。用的话也可以修改main函数。

猜你喜欢

转载自blog.csdn.net/qq_45737419/article/details/107440914