栈初识
- 定义:栈是限定仅在表尾进行插入和删除操作的线性表
- 栈顶:允许插入和删除的一端
- 表尾指的是栈顶,最先进栈的只能在栈底
- 压栈:栈的插入操作
- 出栈:栈的删除操作
- 在不是所有元素都进栈的情况下,事先进去的元素也可以先出栈
栈的顺序存储结构(数组形式)
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;
}