:顺序栈的实现;
#include <iostream.h>
#include <malloc.h>
#define STRAKLENGTHMAX 100
#define LENGTHLONGER 10
typedef struct
{
int *data;
int top;
int starklength;
}StrackList;
int IntStracklist(StrackList *L)
{
L->data=(int*)malloc(STRAKLENGTHMAX*sizeof(int));
if(NULL==L->data) return 0;
(*L).top=0;
(*L).starklength=STRAKLENGTHMAX;
return 1;
}
int ClearStrack(StrackList *L)
{
L->top=0; //虽然L.base[0]有值,但那时的top为1,所以top为零则栈为空
return 1;
}
void DestoryStrack(StrackList *L)
{
ClearStrack(&(*L));
free(L->data); //因为是对data赋了动态空间,所以删的是L->data
}
int EmptyStrack(StrackList L)
{
if(0==L.top)
return 1;
return 0;
}
int LengthStrack(StrackList L)
{
return (L.top); //top的数字就代表着栈内的元素为多少个
}
int GetTopStrack(StrackList L,int e)
{
if(EmptyStrack(L)) return 0;
e=L.data[L.top-1]; //top的数字代表站内的元素的个数,但数组是从0开始,所以top-1为第一个元素
return e;
}
void PopStrack(StrackList *L,int *e) //删除栈第一元素
{
if(0==LengthStrack(*L)) cout<<"ERROR";
*e=(*L).data[(*L).top-1];
(*L).top--;
}
int PushStrack(StrackList *L,int e)
{
int *newdata;
if(LengthStrack((*L))>=STRAKLENGTHMAX) //当栈内的空间不够时,需增加栈的空间
{
newdata=(int *)realloc((*L).data,((*L).starklength+LENGTHLONGER)*sizeof(int));
(*L).data=newdata;
(*L).starklength+=LENGTHLONGER;
}
(*L).data[(*L).top]=e;
(*L).top++;
return 1;
}
void OutStrack(StrackList L)
{
int i;
cout<<"该栈的总长度为 :"<<L.starklength<<endl;
if(0==LengthStrack(L))
cout<<"该栈为空栈 !\n";
else
{
cout<<"该栈的所具有的内容长度为 "<<LengthStrack(L)<<endl;
cout<<"该栈内的内容为 :";
for(i=L.top-1;i>=0;i--) //栈内是后进先出,所以需从top为最大时开始到top为0
cout<<L.data[i]<<" ; ";
}
cout<<endl;
}
void main()
{
StrackList L;
IntStracklist(&L);
OutStrack(L);
int i=0;
for(;i<=99;i++)
PushStrack(&L,i);
OutStrack(L);
PushStrack(&L,100);
OutStrack(L);
int e;
PopStrack(&L,&e);
cout<<"删除的元素为 :"<<e<<endl;
OutStrack(L);
e=GetTopStrack(L,e);
cout<<"栈顶元素为 :"<<e<<endl;
OutStrack(L);
ClearStrack(&L);
OutStrack(L);
DestoryStrack(&L);
}
实验二:十进制数到其它进制数的转换;(直接加入栈函数后即可)
void OutStemp(StrackList L) //输出进制转换后的数
{
int i;
char ch='A';
cout<<"转换后的数为 :";
for(i=L.top-1;i>=0;i--)
{
if(L.data[i]<10)
{
cout<<L.data[i];
}
else
{
cout<<char(ch+L.data[i]-10); //当所得的数大于10时,将需转换为字母输出
}
}
cout<<endl;
}
void Stemp() //进制转换的程序
{
StrackList L;
int count,temp,JZshu; //需转换的数,接受模进制所得的数,转换的进制
char ch='y';
IntStracklist(&L);
while('Y'==ch||'y'==ch)
{
cout<<"请输入你想转换的数字 :";
cin>>count;
cout<<endl;
cout<<"转换为进制数 :";
cin>>JZshu;
while(count!=0)
{
temp=count%JZshu;
PushStrack(&L,temp);
count=count/JZshu;
}
OutStemp(L);
ClearStrack(&L);
cout<<"是否要继续 Y/y :";
cin>>ch;
}
}
实验三:行编辑程序的设计;(直接加入栈函数后即可)
void OutLine(StrackList L) //输出正确字符串
{
for(int i=0;i<L.top;i++)
cout<<L.data[i];
cout<<endl;
}
void LineEdit() //输出正确的字符串
{
StrackList L;
char ch,e;
IntStracklist(&L);
ch=getchar();
while(ch!=';')
{
while(ch!=';'&&ch!='\n') //当为';'和转行符时,结束行判断
{
switch(ch)
{
case '#': PopStrack(&L,&e);break; //当输入字符串中前一个字符错误,可以输入#字符删除前一个字符,break意为执行完语句则跳出switch语句
case '@': ClearStrack(&L);break; //当输入字符串有过多错误,可以直接将字符串删除
default: PushStrack(&L,ch); //其他情况为正确情形,可以输入到栈中
}
ch=getchar();
}
OutLine(L);
ClearStrack(&L); //清空栈
cout<<endl;
if(ch!=';') //当ch不为';'时将继续进行判断,反之输入字符判断结束
ch=getchar();
}
}