Day2-栈

1.顺序栈

课件上的是用指针表示,typedef,define,但是一般结题时候用数组表示更简便,且这种方法具体使用顺序栈是pop,push不一定要写成函数,直接用两句--或者++解决还好点,这里为了练习和程序的可读性还是写了。

#include <stdio.h>
#include <stdlib.h>
#define Max 1024
typedef int ElemType;
typedef struct
{
    ElemType data[Max];
    int top;
}Stack;


//初始化
int s[1000];
int topp=0;
void push()
{
    //入栈
    int pushs;
    printf("请输入数据:");
    scanf("%d",&pushs);
    s[topp]=pushs;
    topp++;
}
void pop()
{
    //出栈
    int pops;
    topp--;
    pops=s[topp];
    printf("%d\n",pops);
}
int isEmpty()
{
    //判空
    if(topp==0)
    return 1;
    else
    return 0;
}
void gettop()
{
    //取栈顶元素
    int up;
    up=s[topp-1];
    printf("%d\n",up);
}
void travers()
{
    int i;
    //if(!isEmpty())
    for(i=0;i<topp;i++)
    printf("%d  ",s[i]);
}
int main()
{
    if(isEmpty())
    {
        printf("空\n");
    }
    push();
    push();
    push();
    travers();
    gettop();
    pop();
    travers();
    return 0;
}

2.链栈

栈也可以说是一种线性表,只不过操作只能在栈顶,根据链式的线性表建立有头插法和尾接法,所以建立链栈也可以用这两种方法。头插法,每次新来的元素放在第一位,所以要有头指针(头指针=top指针);尾接法,每次新来的元素放在第一位,所以要有尾指针(尾指针=top指针),BUT尾接法出栈时指针不好往回播,所以还是用头插法吧。

conversion to non-scalar type requested|;

错误原因,Stack,*StackLink;结构体定义时忘记加*。

#include <stdio.h>
#include <stdlib.h>
#define Max 1024
typedef int ElemType;
typedef struct Stack
{
    ElemType data;
    struct Stack * next;
}Stack,*StackLink;

StackLink intiStack()
{
    StackLink S;
    S=(StackLink)malloc(sizeof(Stack));
    S->next=NULL;
    return S;
}
int isEmpty(StackLink S)
{
    if(!S->next)
    return 1;
    else
    return 0;
}

void push(StackLink S)
{
    StackLink top;
    top=(StackLink)malloc(sizeof(Stack));
    printf("请输入需要入栈的数据:");
    scanf("%d",&(top->data));
    top->next=S->next;
    S->next=top;
    //printf("%d ",S->next->data);
}
int pop(StackLink S)
{
    int topdata;
    StackLink top,p;
    top=S->next;
    if(isEmpty(S))
    {
        printf("栈空无法弹出数据\n");
        return 0;
    }
    topdata=top->data;
    p=top;
    S->next=top->next;
    free(p);
    return topdata;
}
void traves(StackLink S)
{
    //printf("aaaa");
    StackLink top;
    top=S->next;
    while(top!=NULL)
    {
        printf("%d  ",top->data);
        top=top->next;
    }
    printf("\n");
}
int main()
{
    StackLink S,top;
    S=intiStack();
    if(isEmpty(S))
    {
        printf("空\n");
    }
    push(S);
    push(S);
    push(S);
    traves(S);
    pop(S);
    traves(S);

    return 0;
}

简单的遍历一直不对,玩了会儿手机,运行可以了,什么鬼

应用1:回文的判断

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

int main()
{
    int i,j;
    char a[100],S[100],*p;
    gets(a);
    p=a;
    i=0;
    //字符串入栈
    while(*p!='\0')
    {
        S[i]=*p;
        i++;
        p++;
    }
    p=a;
    i--;
    while(i>=0)
    {
        if(*p!=S[i])
        break;
        i--;
        p++;
    }
    if(i==-1)
    printf("是回文\n");
    else
    printf("不是回文\n");
    return 0;
}

应用2:进制转换:

10进制---->其他进制是容易写的,余数压栈,再整除,最后一个一个出栈就行

其他进制---->10进制,首先将数字转化为字符串,然后单个字符入栈,再把单个字符出栈转化为数字应用次方加的公式

这里用到itoa(a,b,c)函数;先介绍一下这个函数,itoa()函数有3个参数:a是要转换的数字,b是要写入转换结果的目标字符串,c是转移数字时所用的基数,神奇的事情是,只要将c改为任何整数,就可以实现将10进制转换为任意进制,负数不行。

猜你喜欢

转载自blog.csdn.net/baidu_36536257/article/details/80184846