- 栈(stack)
- 栈(stack)是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有特殊含义,称为栈顶(top),相应地,表头端称为栈底(bottom)。不含元素的空表称为空栈。
- 栈的特点:栈的修改是按后进先出的原则进行的。因此,栈又称为后进先出(last in first out)的线性表(LIFO)。
- 栈的基本操作:在栈顶进行插入或删除,栈的初始化、判空及取栈顶元素等。
//栈的基本方法-构造一个存储字符元素的栈 即stack.h头文件
#include<stdio.h>
#include<stdlib.h>
#define INITSIZE 100
#define INCRSIZE 10
#define ERROR 0
#define OK 1
typedef int Status;
typedef struct {//构造栈
char *base;
char *top;
int size;
} SqStack;
Status InitStack(SqStack *s) {//初始化栈
s->base = (char *)malloc(INITSIZE * sizeof(char));
if (!s->base)
return ERROR;
s->top = s->base;
s->size = INITSIZE;
return OK;
}
Status ClearStack(SqStack *s) {//清空栈
s->top = s->base;
}
Status StackEmpty(SqStack *s) {//判空
if (s->top == s->base)
return 1;
else
return 0;
}
int StackLength(SqStack (*s) {//获取栈的长度
return s->top - s->base ;
}
Status GetTop(SqStack s, char *e) {//获取栈顶元素
if (s.top == s.base)
return ERROR;
*e = *(s.top - 1);
return OK;
}
Stack Push(SqStack *s, char e) {//压栈
if (s->top - s->base >= s->size) {
s->base = (char *)realloc(s->base, (s->size + INCRSIZE)*sizeof(char));
if (!s->base)
exit(1);
s->top = s->base + s->size;
s->size += INCRSIZE;
}
*(s->top) = e;
s->top ++;
return OK;
}
Status Pop(SqStack *s, char *e) {//弹出元素
if (s->top == s->base)
return ERROR;
*e = *(--s->top);
return OK;
}
void StackTraverse(SqStack *s) {//打印栈中元素,栈顶->栈底
if (!s->base)
exit(1);
char *t = s->top - 1;
while(t >= s->base) {
printf("%c", *t);
t--;
}
}
//c++栈的基本方法
#include<iostream>
using namespace std;
#define starksize 100
typedef struct{
char *base;
char *top;
int length ;
}StarkTR
typedef struct{
int *base;
int *top;
int length ;
}StarkND; //寄存操作数
int InitTR(StarkTR &L){ //初始化寄存operater栈
L.base = new char[starksize];
L.top = L.base;
L.length = starksize;
return 1;
}
int PushTR(StarkTR &L,char e){ //入栈
if(L.top - L.base == L.length){
cout<<"栈满!";
return 0;
}
*L.top++ = e;
return 1;
}
char PopTR(StarkTR &L,char &e){ //出栈
if(L.top - L.base == 0){
cout<<"栈空!";
return 0;
}
e = *--L.top;
return 1;
}
char GetTopTR(StarkTR L){ //取栈顶元素 字符
if(L.top != L.base)
return *(L.top -1);
}
int GetTopND(StarkND L){ //取栈顶元素 数值
if(L.top != L.base)
return *(L.top -1);
}
- 队列(queue)
- 队列(queue)和栈相反,是一种先进先出(first in first out,FIFO)的线性表。它允许在表的一端进行插入,而在另一端删除元素。这和我们生活中的排队是一致的,最早进入队列的元素最早离开。在队列中,允许插入的一端叫做队尾(rear),允许删除的一端则称为队头(front)。
- 队列的基本操作:初始化空队列、清空队列、判空、获取队列的长度、获取队头元素、插入队尾元素、删除队头元素、visit()从队头到队尾遍历等。