以下是栈的一些基本操作:
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 2
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
} Sqstack;
int InitStack(Sqstack &S)
{
if(!(S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType))))
exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
int DestroyStack(Sqstack &S)
{
free(S.base);
S.base=NULL;
S.top=NULL;
S.stacksize=0;
return OK;
}
int ClearStack(Sqstack &S)
{
S.top=S.base;
return OK;
}
int StackEmpty(Sqstack S)
{
if(S.top==S.base)
return TRUE;
else
return FALSE;
}
int StackLength(Sqstack S)
{
return S.top-S.base;
}
int GetTop(Sqstack S,SElemType &e)
{
if(S.top>S.base)
{
e=*(S.top-1);
return OK;
}
else
return ERROR;
}
int Push(Sqstack &S,SElemType e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)
exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*(S.top)++=e;
return OK;
}
int Pop(Sqstack &S,SElemType &e)
{
if(S.top==S.base)
return FALSE;
e=*--S.top;
return OK;
}
int StackTraverse(Sqstack &S,SElemType (*visit)(SElemType))
{
while(S.top>S.base)
visit(*S.base++);
return OK;
}
1.数制转换:
将一个十进制转换成八,十六进制数。
typedef int SElemType; // 定义栈元素类型为整型
#include"c1.h"
//#include"c3-1.h" // 采用顺序栈
#include"c2.cpp" // 利用顺序栈的基本操作
/*void conversion()
{ // 对于输入的任意一个非负10进制整数,打印输出与其等值的16进制数
SqStack s;
unsigned n; // 非负整数
SElemType e;
InitStack(s); // 初始化栈
printf("n(>=0)=");
scanf("%u",&n); // 输入非负十进制整数n
while(n) // 当n不等于0
{
Push(s,n%16); // 入栈n除以16的余数(16进制的低位)
n=n/16;
}
while(!StackEmpty(s)) // 当栈不空
{
Pop(s,e); // 弹出栈顶元素且赋值给e
if(e<=9)
printf("%d",e);
else
printf("%c",e+55);
}
printf("\n");
}*/
void conversion()
{
Sqstack S;
unsigned N;
SElemType e;
InitStack(S);
scanf("%u",&N);
while(N)
{
Push(S,N%8);
N=N/8;
}
while(!StackEmpty(S))
{
Pop(S,e);
printf("%d",e);
}
}
void main()
{
conversion();
}
2.括号配对的检验:
typedef char SElemType;
#include"c1.h"
#include"c2.cpp"
void matching()
{
Sqstack S;
InitStack(S);
char *p,a[100],e;
int state;
printf("请输入一组符号(仅只能含有三种{},(),[]):");
gets(a);
p=a;
state=1;
while(*p && state)
{
if(!(*p=='{' || *p=='}' || *p=='[' || *p==']' || *p=='(' || *p==')'))
{
printf("输入不正确!");
exit(ERROR);
}
switch (*p)
{
case '(':
case '{':
case '[':{
Push(S,*p++);
break;
}
case ')':{
GetTop(S,e);
if(!StackEmpty(S) && e=='(')
{
Pop(S,e);
p++;
}
else
state=0;
break;
}
case ']':{
GetTop(S,e);
if(!StackEmpty(S) && e=='[')
{
Pop(S,e);
p++;
}
else
state=0;
break;
}
case '}':{
GetTop(S,e);
if(!StackEmpty(S) && e=='{')
{
Pop(S,e);
p++;
}
else
state=0;
break;
}
}
}
if(StackEmpty(S) && state)
printf("输入的括号相符合!");
else
printf("输入的括号不符合!");
}
/*void check()
{ // 对于输入的任意一个字符串,检验括号是否配对
Sqstack s;
SElemType ch[80],*p,e;
if(InitStack(s)) // 初始化栈成功
{
printf("请输入表达式\n");
gets(ch);
p=ch;
while(*p) // 没到串尾
switch(*p)
{
case '(':
case '[':Push(s,*p++);
break; // 左括号入栈,且p++
case ')':
case ']':if(!StackEmpty(s)) // 栈不空
{
Pop(s,e); // 弹出栈顶元素
if(*p==')'&&e!='('||*p==']'&&e!='[') // 弹出的栈顶元素与*p不配对
{
printf("左右括号不配对\n");
exit(ERROR);
}
else
{
p++;
break; // 跳出switch语句
}
}
else // 栈空
{
printf("缺乏左括号\n");
exit(ERROR);
}
default: p++; // 其它字符不处理,指针向后移
}
if(StackEmpty(s)) // 字符串结束时栈空
printf("括号匹配\n");
else
printf("缺乏右括号\n");
}
}*/
void main()
{
//char a[]={[(]])]};
matching();
//check();
}