数据结构——链式栈结构的创造与模拟

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

我制作的是一个链栈, 和链表比较相像。将栈的每个元素用指针链接。

下面我们直接上代码:

#include<limits.h>
#include<algorithm>
#include<windows.h>
#include<Windows.h>
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
typedef struct Node
{
    int data;
    Node* pNext;    
}NODE,*PNODE;
typedef struct Stack 
{
    PNODE pTop;
    PNODE pBottom;
}STACK,*PSTACK;
void init(PSTACK ps)
{
    ps->pTop = (PNODE)malloc(sizeof(NODE));
    if(NULL == ps->pTop)
        exit(-1);
    else
    {
        ps->pBottom = ps->pTop;
        ps->pTop->pNext = NULL;
    }
} 
void push(PSTACK ps,int val)
{
    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    pNew->data = val;
    pNew->pNext = ps->pTop;
    ps->pTop = pNew;
}
void traverse(PSTACK ps)
{
    PNODE p = ps->pTop;
    while(p != ps->pBottom)
    {
        printf("%d ",p->data);
        p = p->pNext;
    }
    printf("\n"); 
} 
bool empty(PSTACK ps)
{
    if(ps->pTop == ps->pBottom)
        return true;
    else
        return false;
}
bool pop(PSTACK ps,int* pval)
{
    if(empty(ps))
        return false;
    else
    {
        PNODE r = ps->pTop;
        *pval = r->data;
        ps->pTop = r->pNext;
        free(r);
        r = NULL;
        return true;
    }
} 
void clear(PSTACK ps)
{
    if(empty(ps))
        return;
    else
    {
        PNODE p = ps->pTop;
        PNODE q = p->pNext;
        while(p != ps->pBottom)
        {
            q = p->pNext;
            free(p);
            p = q;
        }
        ps->pTop = ps->pBottom;
    }
} 
int main(void)
{
    L2:
       STACK S;
       printf("plase create one stack:(input -1 to stop the create)\n");
    init(&S);
    int n;
    while(n != -1)
    {
        scanf("%d",&n);
        if(n != -1)
            push(&S,n);
    }
    traverse(&S);
    Sleep(1000);
    L1:
    system("cls");
    printf("the stack is:");
    traverse(&S); 
    printf("plase chosse one operator:\n");
    printf("(1)push\n" );
    printf("(2)pop\n" );
    printf("(3)empty\n" );
    printf("(4)clear\n" );
    printf("now choose:");
    int a;
    int k;
    scanf("%d",&a);
    switch(a)
    {
        case 1:
            printf("to push:val =  ");
            scanf("%d",&k);
            push(&S,k);
             traverse(&S);
             printf("the space will clear by 5s!");
             Sleep(5000);
             goto L1;
            break;
        case 2:
            printf("to pop:");
             pop(&S,&k);
             printf("the lost number is:%d\n",k);
             traverse(&S); 
             printf("the space will clear by 5s!");
             Sleep(5000);
             goto L1;
            break;
        case 3:
            if(empty(&S))
                printf("the stack is empty!\n");
            else
                printf("the stack isn't empty!\n");
            printf("\nthe space will clear by 5s!");
             Sleep(5000);
             goto L1;    
            break;
        case 4:
            printf("start clear...\n");
            clear(&S);
            Sleep(1000);
            printf("clear finish,the program stop!");
            exit(-1);
        default:
            printf("input error!");
            Sleep(1000);
            goto L1;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值