<pre name="code" class="cpp"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:12px;">#define TRUE 1</span></span>
#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;typedef int SElemType;
栈的定义和基本操作:
1.顺序栈结点:
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
};
2.基本操作:
//构造一个空栈S
Status InitStack(SqStack &S)
{
S.base = (SElemType *)malloc(sizeof(SElemType)*STACK_INIT_SIZE);
if (!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
//获取栈中元素(若栈不空则返回栈顶元素,并返回OK,否则返回ERROR)
Status GetTop(SqStack S, SElemType &e)
{
if (S.base == S.top) return ERROR;
e = *(S.top - 1);
return OK;
}
//插入元素e为新的栈顶元素
Status Push(SqStack &S, SElemType e)
{
if (S.top - S.base >= S.stacksize) { //栈满,追加空间
S.base = (SElemType *)realloc(S.base,
sizeof(SElemType)*(S.stacksize + STACKINCREMENT));
if (!S.base) exit(OVERFLOW);
S.top = S.base + STACK_INIT_SIZE;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}
//若栈不空,删除栈顶元素,并用e返回其值,并返回OK;否则,返回ERROR
Status Pop(SqStack &S, SElemType &e)
{
if (S.top == S.base) return ERROR;
e = *--S.top;
return OK;
}
//栈空
Status StackEmpty(SqStack &S)
{
<span style="white-space:pre"> </span>if (S.top == S.base) return TRUE;
<span style="white-space:pre"> </span>return FALSE;
}
栈的应用:
1.数制转换
void Conversion(){
SqStack S;
SElemType e;
int N;
InitStack(S);
scanf("%d", &N);
while(N){
Push(S, N % 8);
N = N / 8;
}
while (!StackEmpty(S)){
Pop(S, e);
printf("%d", e);
}
}
2.行编辑程序:
void LineEdit()
{
InitStack(S);
ch = getchar();
while (ch != EOF ) {
while (ch != EOF && ch != '\n'){
switch (ch) {
case '#': Pop(S, c);
case '@': ClearStack(S);
default: Push(S, ch);
}
ch = getchar();
}
ClearStack(S);
if (ch != EOF) ch = getchar();
}
DestroyStack(S);
}