栈概念
栈是一个有用的数据结构,它就像摞在一起的盘子。
- 可以放一个新盘子到顶部
- 从顶部移除一个盘子
如果放盘子到底部,必须首先移除所有盘子,这种方法叫做Last In First Out,最后放的盘子要首先移除。
在编程中的栈
在编程中,放一个元素叫做push,移除一个元素叫做pop。
尽管2最后放进去,但是首先移除,遵循LIFO原则。
尽管可以使用C,C++,Java,Python,C#实现栈,但是原理都是相同的。
栈操作
栈是一个对象或者是一个抽象数据结构(ADT),允许下面的操作:
- push:添加元素到栈
- pop:从栈中移除元素
- IsEmpty:检查栈是否为空
- IsFull:检查栈是否满
- Peek:得到栈的顶部元素,但是不移除
栈工作原理
- 一个TOP的指针指向栈的顶部元素
- 当初始化栈时,设置TOP的值为-1,检测栈是否为空(TOP == -1)
- 当添加元素后,我们增加TOP的值,TOP指向新元素的位置
- 当移除元素时,返回TOP指向元素的值,并减少TOP的值
- 在push之前,首先检测栈是否满
- 在pop之前,首先检测栈是否空
实现栈
大部分栈使用arrays实现,但是也可以使用lists实现。
C语言实现
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define MAX 10
struct stack
{
int items[MAX];
int top;
};
typedef struct stack st;
void createEmptyStack(st *s)
{
s->top=-1;
}
int isfull(st *s)
{
if (s->top==MAX-1)
return 1;
else
return 0;
}
int isempty(st *s)
{
if (s->top==-1)
return 1;
else
return 0;
}
void push(st *s)
{
int newitem;
printf("Enter item to be inserted: ");
scanf("%d",&newitem);
if (isfull(s))
{
printf("STACK FULL");
}
else
{
s->top++;
s->items[s->top]=newitem;
}
}
void pop (st *s)
{
if (isempty(s))
{
printf("\n STACK EMPTY \n");
}
else
{
printf("Item popped= %d",s->items[s->top]);
s->top--;
}
}
void main()
{
int ch;
int loop;
loop=1;
st *s;
createEmptyStack(s);
do
{
printf("\n ***STACK OPERATIONS");
printf("\n 1. PUSH");
printf("\n 2. POP");
printf("\n 3. EXIT");
printf("\n ***************");
printf("\n Enter your choice: ");
scanf("%d", &ch);
switch (ch)
{
case 1:
push(s);
break;
case 2:
pop(s);
break;
case 3:
printf("THANK YOU");
loop=0;
exit(0);
default:
printf("Invalid choice");
}
} while(loop);
getch();
}
栈的使用
- 反转单词
- 编译器通过转换表达式为prefix或者postfix形式来计算表达式的值
- 浏览器中的返回按钮