栈的顺序表示及应用

#include
using namespace std;
#define STACK_INIT_SIZE 100
#define STACKINCREASE 10
#define INT int
#define CHAR char

typedef struct
{
CHAR *base;
CHAR *top;
int stacksize;//当前已分配存储空间
}SqStack;
bool InitStack(SqStack &s)
{
if (!(s.base = (CHAR *)malloc(STACK_INIT_SIZE * sizeof(CHAR))))return false;
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
return true;
}

bool DestroyStack(SqStack &s)
{
CHAR *p = s.base;
CHAR *q;
while (p != s.top)
{
q = p + 1;
free§;
p = q;
}
s.stacksize = 0;
s.top = s.base = NULL;
free(s.top);
free(s.base);
return true;
}

bool ClearStack(SqStack &s)
{
CHAR *p = s.top - 1;
while (p != s.base)
{
*p = 0;
p–;
}
*p = 0;
s.top = s.base;
s.stacksize = 0;
return true;
}

bool StackEmpty(SqStack s)
{
if (s.base == s.top)return true;
else return false;
}

int StackLength(SqStack s)
//返回s的元素个数
{
return s.stacksize;
}

bool GetTop(SqStack s, CHAR &e)
{
if (s.top == s.base)return false;
e = (s.top - 1);
return true;
}
bool Push(SqStack &s, CHAR e)
{
if ((s.top - s.base) == s.stacksize)
s.base = (CHAR
)realloc(s.base, (STACKINCREASE + STACKINCREASE) * sizeof(CHAR));
*s.top = e;
s.top = s.top + 1;
s.stacksize++;
return true;
}

bool Pop(SqStack &s, CHAR &e)
{
if (s.top == s.base)return false;
e = *(s.top - 1);
s.top–;
return true;
}

bool Pop(SqStack &s)
{
if (s.top == s.base)return false;
s.top–;
s.stacksize–;
return true;
}

void PrintStack(SqStack s)
//输出栈中所有元素
{
CHAR *p = s.base;
while (p != s.top)
{
cout << *p;
p++;
}
cout << endl;

}

/------------------------------栈的应用------------------------------/
void conversion8()
//进制转换,输入10进制数,输出对应8进制数
//将所有CHAR改为INT
{
SqStack s;
InitStack(s);
CHAR n;//十进制
cin >> n;
while (n)
{
Push(s, n % 8);
n /= 8;
}
CHAR e;
while (!StackEmpty(s))
{
Pop(s, e);
cout << e;
}
}

void MatchSymbol()
//括号匹配
//需要把所有INT改为CHAR
//只支持输入()[]{}
{
SqStack s;
InitStack(s);
CHAR n;
while (cin >> n)
{
if (s.bases.top)
{
Push(s, n);
}
else
{
switch (n)
{
case ‘[’:case ‘(’:case ‘{’: break;
case ‘]’:
{
if ((s.top-1)!=’[’)break;
Pop(s); break;
}
case ‘)’:
{
if (
(s.top - 1) != ‘(’)break;
Pop(s);
}
case ‘}’:
if (*(s.top - 1) != ‘{’)break;
Pop(s); break;
}
}
cout << "top: " << *(s.top - 1) << endl;
}
if (s.top
s.base)cout << “匹配” << endl;
else cout << “不匹配” << endl;
}

void LineEdit()
//行编辑器,#代表退格,@代表本行@之前所有字符无效
//将INT改为CHAR
{
SqStack s;
InitStack(s);
char n;
n = getchar();
while (n != EOF)
{
while (n != EOF && n != ‘\n’)
{
switch (n)
{
case ‘#’:Pop(s); break;
case ‘@’:ClearStack(s); break;
default:Push(s, n);
}
n = getchar();
}
PrintStack(s);//输出
ClearStack(s);
if (n != EOF)n = getchar();
}
}

int main()
{

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值