栈的初了解

栈初识

  • 定义:栈是限定仅在表尾进行插入和删除操作的线性表
  • 栈顶:允许插入和删除的一端
  • 表尾指的是栈顶,最先进栈的只能在栈底
  • 压栈:栈的插入操作
  • 出栈:栈的删除操作
  • 在不是所有元素都进栈的情况下,事先进去的元素也可以先出栈

栈的顺序存储结构(数组形式)

top:栈顶元素在数组中的位置。(top<StackSize)

空栈的判定条件(top=-1)

-栈操作

//栈的结构定义
typedef int SElemType
typedef stuct
{
    SElemType data[MAXSIZE];
    int top;//用于栈顶指针
}SqStack;
//入栈操作
Status Push (SqStack *S,SElemType e)
{
    if(S->top==MAXSIZE-1)//栈满
        {
            return ERROR;
        }
    S->top++;//栈顶指针加一
    S->data[S->top]=e;
    return OK;
}
//出栈操作
Status Pop(SqStack *S,SElemType *e)
{
    if(S->top==-1)
           return ERROR;
    *e=S->data[S->top];
    S->top--;
    return OK;
}

两栈共享空间

//结构代码
typedef struct//两头
{
    SElemtype data[MAXSIZE];
    int top1;//栈1栈顶指针
    int top2;//栈2栈顶指针
}SqDoubleStack;
//入栈
//stackNumber判断是栈1还是栈2
Status Push(SqDoubleStack *S,SElemType e,int stackNumber)
{
    if(S->top1+1=S->top2)//表示栈满了
        return ERROR;
    if(stackNumber==1)//栈1有元素进栈
    {
        S-data[++S->top1]=e;
    }
    else if(stackNumber==2)
    {
        S->data[--S->top2]=e;
    }
    return OK;
}
//出栈
Status Pop(SqDoubleStack *S,SElemType *e,int stackNumber)
{
    if(stackNumber==1)
    {
        if(S->top1==-1)
        {
            return ERROR;
        }
        else
        {
            *e=S->data[S->top1--];
            return OK;
        }
    }
    if(stackNumber==2)
    {
        if(S->top2==MAXSIZE)
        {
            return ERROR;
        }
        else
        {
            *e=S->data[S->top2++];
            return OK;
        }
    }
}

栈的链式存储结构及实现(链表形式)

顺序和链式的区别

typedef struct StackNode//节点数据类型
{
    SElemType data;
    struct StackNode *next;
}StackNode,*LinkeStackPtr;

typedef struct LinkStack
{
    LinkStackPtr top;
    int count;
}LinkStack;
//入栈操作
Status Push(LinkStack *S,SElemType e)
{
    //新节点是s
    LinkeStackPtr s=(LinkeStackPtr)malloc(sizeof(StackNode));   
    s->data=e;
    s->next=S->top;
    S->top=s;
    S->count++;

栈的应用——四则运算表达式求值

了解:中缀表达式和后缀表达式

中缀表达式:日常使用的表达式 比如:(1+2)*3+3*5 操作符号在中间,数在两侧。
后缀表达式:计算机计算时用到的表达式。数字在前,符号在后。

计算原理:

1、 中缀表达式—>后缀表达式

2、 后缀表达式进行运算


如何把中缀表达式—>后缀表达式?

规则:

从左到右遍历表达式
如果是数字 直接输出
如果是符号,判断符号与栈顶元素的优先级
如果这个符号比栈顶元素优先级高,则入栈
如果这个符号比栈顶元素优先级低,把栈顶元素一次出栈,再将这个符号入栈
一直到最后完成转换

后缀表达式如何运算?

从左到右遍历表达式
遇到数字进栈
遇到符号时将栈顶两个元素出栈并运算
运算结果再入栈

栈的应用—判断是否为回文数

#include<stdio.h>
#include<string.h>
int main()
{
    char a[101];
    char s[101];
    int i,len,mid,next,top;

    gets(a);
    len=strlen(a);
    mid=len/2-1;
    top=0;//初始化栈
    for(i=0;i<=mid;i++)//入栈
    {
        s[++top]=a[i];
    }
    if(len%2==0)
    {
        next=mid+1;
    }
    else
    {
        next=mid+2;
    }
    for(i=next;i<=len-1;i++)
    {
        if(a[i]!=s[top])
            break;
        top--;
    }
    if(top==0)
    {
        printf("YES\n");
    }
    else
    {
        printf("NO\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/gxyqn626/article/details/81167217