SDUT-3335_数据结构实验之栈与队列八:栈的基本操作

Posted luoxiaoyi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SDUT-3335_数据结构实验之栈与队列八:栈的基本操作相关的知识,希望对你有一定的参考价值。

数据结构实验之栈与队列八:栈的基本操作

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

堆栈是一种基本的数据结构。堆栈具有两种基本操作方式,push 和 pop。push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出。现在我们就来验证一下堆栈的使用。

Input

首先输入整数t(1 <= t <= 10),代表测试的组数,以后是 t 组输入。
对于每组测试数据,第一行输入两个正整数 m(1 <= m <= 100)、n(1 <= n <= 1000),其中m代表当前栈的最大长度,n代表本组测试下面要输入的操作数。 而后的 n 行,每行的第一个字符可能是‘P’或者‘O’或者‘A’;如果是‘P’,后面还会跟着一个整数,表示把这个数据压入堆栈;如果是‘O’,表示栈顶元素出栈;如果是‘A‘,表示询问当前栈顶的值‘。

Output

对于每组测试数据,根据其中的命令字符来处理堆栈;
(1)对所有的‘P‘操作,如果栈满输出‘F‘,否则完成压栈操作;
(2)对所有的‘A‘操作,如果栈空,则输出‘E‘,否则输出当时栈顶的值;
(3)对所有的‘O‘操作,如果栈空,则输出‘E‘,否则输出栈顶元素的值,并让其出栈;
每个输出占据一行,每组测试数据(最后一组除外)完成后,输出一个空行。

Sample Input

2
5 10
A
P 9
A
P 6
P 3
P 10
P 8
A
P 2
O
2 5
P 1
P 3
O
P 5
A

Sample Output

E
9
8
F
8

3
5

Hint

建议: 用串的方式(%s)读入操作字符。

栈的几个基本操作,没有什么好说的,看代码就好,注意输入由于单个字符容易输入错误,所以建议用字符串读入。
注意输出。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct node
{
    int data;
    struct node *next;
}Node;

typedef struct stack
{
    Node *base,*top;
    int len;
}Stack;

struct num
{
    int data,next;
}s[100050];

Node *newnode()//建立节点
{
    Node *t;
    t = (Node *)malloc(sizeof(Node));
    t->next = NULL;
    return t;
};

Stack *Newstack()//建立新栈
{
    Stack *t;
    t = (Stack *)malloc(sizeof(Stack));
    t->top = newnode();
    t->base = t->top;
    t->len = 0;
    return t;
}

void push(Stack *t,int x)//入站
{
    Node *p = newnode();
    p->data = x;
    p->next = t->top->next;
    t->top->next = p;
    t->base = p;
    t->len++;
}

int top(Stack *t)//询问栈顶元素
{
    return t->top->next->data;
}

void pop(Stack *t)//出栈
{
    Node *p;
    p = t->top->next;
    t->top->next = t->top->next->next;
    free(p);
    t->len--;
}

int empty(Stack *t)//询问栈是否为空
{
    if(t->top->next==NULL)
        return 1;
    return 0;
}

void del(Stack *t)//清空栈
{
    while(!empty(t))
        pop(t);
}

int main()
{
    int t,i,m,n,x;
    char s[10];
    Stack *q;
    q = Newstack();
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        while(!empty(q))
            pop(q);
        for(i=0;i<m;i++)
        {
            scanf("%s",s);
            if(s[0]=='A')
            {
                if(empty(q))
                    printf("E
");
                else
                    printf("%d
",top(q));
            }
            else if(s[0]=='P')
            {
                scanf("%d",&x);
                if(q->len==n)
                    printf("F
");
                else
                    push(q,x);
            }
            else if(s[0]=='O')
            {
                if(empty(q))
                    printf("E
");
                else
                {
                    printf("%d
",top(q));
                    pop(q);
                }
            }
        }
        if(t!=0)
            printf("
");
    }
    return 0;
}

以上是关于SDUT-3335_数据结构实验之栈与队列八:栈的基本操作的主要内容,如果未能解决你的问题,请参考以下文章

SDUT-2131_数据结构实验之栈与队列一:进制转换

SDUT-2449_数据结构实验之栈与队列十:走迷宫

SDUT-2088_数据结构实验之栈与队列十一:refresh的停车场

C/C++|DataStructure栈与队列之栈的顺序存储结构

数据结构----栈与队列之栈的应用四则运算表达式求值

大话数据结构4之栈与队列