这两天没来得及更,在看数据库的一些东西,发现简直要学的太多了…果然,我就是条懒狗。
—————————————————————————————————————————————
抽象数据类型栈的定义
栈是限定仅在表尾进行插入或删除操作的线性表。
- 原则:LIFO(last in first out)后进先出
栈的基本操作除了在栈顶进行插入或者删除外,还有栈的初始化,判空及取栈顶元素等。
栈的表示与实现
- 栈和线性表类似,有两种存储方式:
顺序栈:利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素
链栈:链栈的定义和线性表一样,只不过只能在栈顶进行操作
模块说明
#define STACK_INIT_SIZE 100;
#define STACKINCREMENT 10;
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
栈的初始化
Status initStack(SqStack &s)
{
s.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));//开辟动态内存
//(SElemType*)把void*类型指针转换为(SElemType*)类型
//((STACK_INIT_SIZE)*sizeof(SElemType))是指分配STACK_INIT_SIZE个像SElemType这么大的内存
//相当于假如STACK_INIT_SIZE=100;sizeof(int)=4;所以实际要分配100*4=400个字节的内存
if(!s.base) exit(OVERFLOW);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return OK;
}
入栈
Status push(SqStack &s,SElemType e)
{
if(s.top-s.base>=s.stacksize)//如果栈满,则追加存储空间(栈顶指针-栈底指针得到栈中元素个数,如果该值大于等于栈容量说明栈满)
//以下为若栈满,追加存储空间的代码
{
s.base=(SElemType*)realloc(s.base,(s.stacksize+STACK_INCREMENT)*sizeof(SElemType));
if(!s.base) exit (OVERFLOW);
s.top=s.base+s.stacksize; //栈顶指针=栈底指针 + 栈容量
s.stacksize+=STACK_INCREMENT; //栈容量 = 原先栈容量 + 新增内存空间
}
//以上为若栈满,追加存储空间的代码
*s.top++=e;//先将需要插入的元素赋值给栈顶指针所指位置,栈顶指针再向上移动一个单位
return OK;
}
出栈
Status pop(SqStack &s,SElemType &e)
{
if(s.base==s.top) return ERROR;
e=*--s.top;
return OK;
}
取栈顶元素
Status getTop(SqStack s,SElemType &e)
{
if(s.top==s.base) return ERROR;
e=*(s.top-1);
return OK;
}
栈容量
int getStackElemNum(SqStack s)
{
if(s.top==s.base) return 0;
return(s.top-s.base);
判断是否空栈
Status isEmpty(SqStack s)
{
if(s.top==s.base)
return TRUE;
else
return FALSE;
}
栈的应用
数制转换
N=(N div d) x d +N mod d (短除法)
div为整除,mod为求余
void conversion()
{
InitStack(S);//初始化栈
scanf("%d",N);输入
while(N)
{
Push(S,N%8);
N=N/8;
}
while(!StackEmpty(S))
{
Pop(S,e);
printf("%d",e);
}
}
括号匹配
bool matching(char exp[])
{
int state=1;
ch=*exp++;
while(ch!='#'&& state)
{
switch(ch)
{
case '(':case '[':
{
Push(S,ch);
break;
}
case ')':
{
if(!StackEmpty(S) && GetTop(S)=='(')
Pop(S,e);
else state=0 break;
}
case '[':
{
if(!StackEmpty(S) && GetTop(S)=='[')
Pop(S,e);
else state=0 break;
}
ch=*exp++;
}
case ')':
{
if(!StackEmpty(S) && GetTop(S)=='(')
{
Pop(S,e)
else state=0 break;
}
}
case ']':
{
if(StackEmpty(S) && GetTop(S)=='[')
{
Pop(S,e)
else state=0 break;
}
}
ch=*exp++;
}
if(state && StackEmpty(S)) return true;
else return false;
}
表达式求值
中缀 | 后缀 |
---|---|
a * b + c | a b * c + |
a+(b*c+d) | a b c * d + e / + |