栈的顺序表示和实现
1
2
3
4
5
void InitStack(SqStack *p)
{if(!p)
printf("内存分配失败!");
p->top =-1;
}
/*入栈*/
void Push(SqStack *p,ElemType x)
{if(p->top
{p->top =p->top+1;
p->stack[p->top]=x;
}
else
printf("Overflow! \n");
}
/*出栈*/
ElemType Pop(SqStack *p)
{ElemType x;
if(p->top>=0)
{ x=p->stack[p->top];
printf("以前的栈顶数据元素%d已经被删除!\n",p->stack[p->top]); p->top=p->top-1;
return(x);
}
else
{printf("Underflow! \n");
return(0);
}
}
/*获取栈顶元素*/
ElemType GetTop(SqStack *p)
{ ElemType x;
if(p->top>=0)
{ x=p->stack[p->top];
printf("\n栈顶元素为:%d\n",x);
return(x);
}
else
{ printf("Underflow! \n");
return(0);
}
}
/*遍历顺序表*/
void OutStack(SqStack *p)
{ int i;
6
printf("\n");
if(p->top
printf("这是一个空表!");
for(i=p->top;i>=0;i--)
printf("第%d个数据元素是: %6d\n",i,p->stack[i]); }
/*置空顺序表*/
void setEmpty(SqStack *p)
{p->top=-1;}
/* 数值转换 */
void shuzhi(SqStack *p,int n,int x)
{
while(n){
Push(p,n%x);
n=n/x;
}
}
/*判断回文数*/
bool huiwen(SqStack *p,int n){
int i=0,j=0;
int a[MAXNUM];
while(n){
a[i]=n%10;
Push(p,n%10);
n=n/10;
i++;
}
while(p->stack[p->top-j]==a[j]) j++;
if(j
return 0;
else
return 1;
}
/*主函数*/
void main()
{SqStack *q;
int cord,x,n,y;ElemType a;
printf("第一次使用必须初始化!\n");
do{
printf("\n");
printf("\n----------主菜单------------\n"); printf("\n 1 初始化顺序表 \n"); printf("\n 2 插入一个元素 \n"); printf("\n 3 删除栈顶元素 \n"); 7
printf("\n 4 取栈顶元素 \n"); printf("\n 5 置空顺序栈 \n"); printf("\n 6 数制转换 \n"); printf("\n 7 判断回文数 \n"); printf("\n 8 结束程序运行 \n"); printf("\n----------------------------\n"); printf("请输入您的选择(1,2,3,4,5,6,7)"); scanf("%d",&cord);
printf("\n");
switch(cord)
{case 1:
{q=(SqStack * )malloc(sizeof(SqStack)); InitStack(q);
OutStack(q);
}break;
case 2:
{printf("请输入要插入的数据元素: a="); scanf("%d",&a);
Push(q,a);
OutStack(q);
}break;
case 3:
{ Pop(q);
OutStack(q);
}break;
case 4:
{ GetTop(q);
OutStack(q);
}break;
case 5:
{ setEmpty(q);
printf("\n顺序栈被置空! \n"); OutStack(q);
}break;
case 6:
{q=(SqStack * )malloc(sizeof(SqStack)); int i;
InitStack(q);
printf("请输入要转换的数制:\n"); scanf("%d",&x);
printf("请输入要转换的数:N="); scanf("%d",&n);
shuzhi(q,n,x);
if(q->top
8
printf("!");
for(i=q->top;i>=0;i--)
printf("%6d",q->stack[i]);
}break;
case 7:
{
q=(SqStack * )malloc(sizeof(SqStack));
int s;
InitStack(q);
printf("请输入要判断的正数:\n"); scanf("%d",&y);
s=huiwen(q,y);
if(s==1)
printf("%d是回文数!",y); else
printf("%d不是回文数!",y);
}break;
case 8:
exit(0);
}
}while(cord
}
9