【数据结构】----C语言实现栈操作

问题描述

假设给定的整数栈初始状态为空,栈的最大容量为100。从标准输入中输入一组栈操作,按操作顺序输出出栈元素序列。栈操作:1表示入栈操作,后跟一个整数(不为1、0和-1)为入栈元素;0表示出栈操作;-1表示操作结束。

输入形式

从标准输入读取一组栈操作,入栈的整数和表示栈操作的整数之间都以一个空格分隔。

输出形式

在一行上按照操作的顺序输出出栈元素序列,以一个空格分隔各元素,最后一个元素后也要有一个空格。如果栈状态为空时进行出栈操作,或栈满时进行入栈操作,则输出字符串“error”,并且字符串后也要有一空格。所有操作都执行完后,栈也有可能不为空。

样例输入

1 3 1 5 1 7 0 0 1 8 0 1 12 1 13 0 0 0 0 1 90 1 89 0 -1

样例输出

7 5 8 13 12 3 error 89

样例说明

入栈元素依次为3、5、7,然后有两次出栈动作,所以先输出7和5,这时栈中只有元素3;之后元素8入栈,又出栈,输出8;随后元素12和13入栈,再进行4次出栈操作,输出13、12和3,这时栈为空,再进行出栈操作会输出error;最后90和89入栈,进行一次出栈操作,输出89,栈中剩余1个元素。

评分标准

该题要求按照操作的顺序输出出栈元素序列,提交程序名为stack.c。

代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Node
{
    int data;
    struct Node *pNext;
}Node;

typedef struct Stack
{
    Node * pTop;
    Node * pButtom;
}Stack;


void init_stack(Stack * ps);//初始化栈
int is_empty(Stack *ps);//判断是否为空栈
void push_stack(Stack *ps, int val);
int pop_stack(Stack *ps, int *pVal);

int main(int argc, char *argv[])
{
    int count = 0;
    int flg = 0;
    int inputOperation[100] = {0};

    //测试数据:1 3 1 5 1 7 0 0 1 8 0 1 12 1 13 0 0 0 0 1 90 1 89 0 -1
    int *p = inputOperation;
    /*printf("请输入栈操作序列:\n");*/
    do //输入操作序列
    {
        scanf("%d",&flg);
        inputOperation[count++] = flg;
    }while(flg != -1);

    Stack s;//创建一个链栈
    init_stack(&s);//并初始化该链栈

    p = inputOperation;

    while(*p != -1)
    {
        if (*p == 1)
        {
            if (*(p+1) == 1 || *(p+1) == 0 || *(p+1) == -1)//整数不能和操作数相同
            {
                printf("操作序列输入错误!\n");
                break;
            }
            push_stack(&s, *(p+1));//将当前指针后一个整数入栈

            p+=2;//将指针指向下一个操作数
        }
        else if (*p == 0)
        {
            int popVal = 0;
            if(pop_stack(&s, &popVal))//将出栈元素放到popVal中
                printf("%d ",popVal);
            else
                printf("error ");

            p+=1;//将指针指向下一个操作数
        }
    }

    printf("\n");
    system("pause");
    return 0;
}


void init_stack(Stack * ps)
{
    ps->pButtom = ps->pTop = (Node *) malloc (sizeof(Node));
    ps->pButtom->pNext = NULL;
}

int is_empty(Stack *ps)
{
    if (ps->pTop == ps->pButtom)
        return 1;
    else
        return 0;
}

void push_stack(Stack *ps, int val)
{
    Node * pNew = (Node *) malloc (sizeof(Node));
    pNew->data = val;
    pNew->pNext = ps->pTop;

    ps->pTop = pNew;
    return;
}

int pop_stack(Stack *ps, int *pVal)
{
    Node *pWork = ps->pTop;
    if (is_empty(ps))
        return 0;

    *pVal = ps->pTop->data;
    ps->pTop = ps->pTop->pNext;
    free(pWork);
    return 1;
}

样例输出:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/as480133937/article/details/105940756