什么是栈和队列
栈(stack),是一种"后进先出"(Last In First Out,LIFO)的线性表,其限制是只允许在表的一端进行插入和删除运算。比如往桌子上放盘子,往上放盘子(压栈)后,只能从最上面(栈顶)取盘子(弹栈)。
队列(queue),是一种"先进先出" (First in First Out,FIFO)的线性表,其限制是允许在表达的一端进行删除操作,另一端进行插入运算。
栈和队列的数组模拟实现以及常见基本算法
栈的实现:
int stack[MAXN]; //开辟栈需要的数组空间
int top = 0; //栈顶指针,指向下一个待插入的数组位置
结构体方法:
#define MAXSIZE 50 //定义栈中元素的最大个数
typedef int ElemType; //ElemType的类型根据实际情况而定,这里假定为int
typedef struct{
ElemType data[MAXSIZE];
int top; //用于栈顶指针
}SqStack;
基本算法:
判断栈是否为空:
bool stackEmpty(int top) {
if (top == 0) return true;
else
return false;
}
判断栈是否满栈:
bool stackOverflow (int top) {
if (top >= MAXN) return true;
else
return false;
}
压栈操作:
void push(int x) {
if(top >= MAXN)
cout << "Stack is overflow";
else
stack[top++]=x; //stack[top]=x;top++;
}
出栈操作:
void pop() {
if (top == 0)
cout << "Stack is empty.";
else
p--;
}
查找栈顶元素:
int topValue() {
if (top == 0) {
cout << "Stack is empty.";
return -1;
}
else
return stack[top-1]; //top是下一个待插入栈空间的指针,所以栈顶是top-1;
}
队列的实现:
int queue[MAXN]; //开辟队列需要的数组空间
int head = 0; //队首指针
int tail = 0; //队尾指针,如果有新的元素插入,就会插入到这个位置
结构体方法:
#define MAXSIZE 50 //定义队列中元素的最大个数
typedef struct{
<ElemType> data[MAXSIZE]; //存放队列元素
int front,rear;
}SqQueue;
基本算法:
判断队列是否为空:
bool isEmpty() {
if(head == tail)
return true;
else
return false;
}
判断队列是否溢出:
bool isOverflow() {
if (tail >= MAXN)
return true;
else
return false;
}
进队:
void push(int x) {
if (tail >= MAXN) //判断队列是否溢出
printf("Queue is overflow");
else
queue[tail++] = x; //queue[tail]=x;tail++;
}
出队:
void pop() {
if(head == tail)
printf("Queue is empty.");
else
head++;
}
查询队首队元素:
int frontValue() {
if(head == tail) {
printf("Queue is empty");
return -1;
}
else
return queue[head];
}
单调栈和单调队列