#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.tops.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()
{
}