定義
//定義
typedef struct LinkStack
{
int data;
struct LinkStack* next;
}LinkStack;
基本操作
//初始化棧
LinkStack* InitLinkStack()
{
LinkStack* s = (LinkStack*)malloc(sizeof(LinkStack));
s->next = NULL;
return s;
}
//銷燬棧
void DestroyLinkStack(LinkStack* s)
{
LinkStack* pre = s;
LinkStack* p = s->next;
while (!p)
{
free(pre);
pre = p;
p = pre->next;
}
free(pre);
}
//棧判空
int LinkStackIsEmpty(LinkStack* s)
{
return (s->next == NULL);
}
//入棧
void PushLinkStack(LinkStack* s,int e)
{
LinkStack* p = (LinkStack*)malloc(sizeof(LinkStack));
p->data = e;
p->next = s->next;
s->next = p;
}
//出棧
void PopLinkStack(LinkStack* s, int *e)
{
if (!s->next)
return;
LinkStack* p = s->next;
*e = s->next->data;
s->next = s->next->next;
free(p);
}
//得到棧頂元素
void GetLinkStackTop(LinkStack* s, int* e)
{
if (!s->next) return;
*e = s->next->data;
}
應用
//設計一種方法判斷字符串中括號是否對稱
//函數參數以及結構體data類型要相應修改,或者使用ascii值進行判斷
int MatchBrackets(char* ch)
{
LinkStack* s = InitLinkStack();
int n = strlen(ch);
int i = 0;
char e;
bool match = true;
while (i < n && match)
{
if (ch[i] == '(')
{
PushLinkStack(s, ch[i]);
}
else if (ch[i] == ')')
{
if (s->next->data == '(')
PopLinkStack(s, &e);
else
{
DestroyLinkStack(s);
return false;
}
}
i++;
}
if (!LinkStackIsEmpty(s)) match = false;
DestroyLinkStack(s);
return match;
}
- 算式轉爲後綴表達式
//將中綴表達式轉爲後綴表達式
void Trans(ElemType* exp, ElemType postExp[])
{
SqStack* pExp = InitStack();
char e = '0';
int i = 0;
while (*exp != '\0')
{
switch (*exp)
{
case '(':
Push(pExp, *exp);
exp++;
break;
case ')':
Pop(pExp, &e);
while (e != '(')
{
postExp[i++] = e;
Pop(pExp,& e);
}
exp++;
break;
case '+':
case '-' :
while (!StackEmpty(pExp))
{
GetTop(pExp, &e);
if (e != '(')
{
Pop(pExp, &postExp[i]);
i++;
}
else
break;
}
Push(pExp, *exp);
exp++;
break;
case '*':
case '/':
while (!StackEmpty(pExp))
{
GetTop(pExp, &e);
if (e == '*' || e == '/')
{
Pop(pExp, &postExp[i]);
i++;
}
else
break;
}
Push(pExp, *exp);
exp++;
break;
default:
while ((*exp >= '0') && (*exp <= '9'))
{
postExp[i++] = *exp;
exp++;
}
postExp[i++] = '#';
break;
}
}
while (!StackEmpty(pExp))
{
Pop(pExp, &postExp[i]);
i++;
}
postExp[i++] = '\0';
DestroyStack(pExp);
}
- 計算後綴表達式的值
//計算後綴表達式的計算值
void CompValue(char * postExp)
{
double a, b, c, d;
//這裏使用的棧要將ElemType設置成double型,
//因爲要進行數值計算
SqStack* Opnd = InitStack();
;
//
while (*postExp != '\0')
{
switch ( *postExp)
{
case '+':
Pop(Opnd, &a);
Pop(Opnd, &b);
c = b + a;
Push(Opnd, c);
break;
case '-':
Pop(Opnd, &a);
Pop(Opnd, &b);
c = b - a;
Push(Opnd, c);
break;
case '*':
Pop(Opnd, &a);
Pop(Opnd, &b);
c = b * a;
Push(Opnd, c);
break;
case '/':
Pop(Opnd, &a);
Pop(Opnd, &b);
if (a != '/')
{
c = b / a;
Push(Opnd, c);
break;
}
else
{
printf("error !");
exit(0);
}
break;
default:
d = 0;
while (*postExp >= '0' && *postExp <= '9')
{
d = 10 * d + (*postExp - '0');
postExp++;
}
Push(Opnd, d);
break;
}
postExp++;
}
GetTop(Opnd, &a);
return a;
return a;
}
迷宮問題求解
- 給定一個迷宮M*N
- 設立數組來表示迷宮,1表示有阻礙,0表示空白
- 算法
//定義
int mg[M + 2][N + 2] =
{
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,0,0,1,1,0,0,1},
{1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,1,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}
};
typedef struct Box
{
int i;
int j;
int adj;
}Box;
typedef struct SqMgStack
{
Box data[MAX_SIZE];
int top;
}SqMgStack;
//實現過程
bool MgPath(int xi,int yi,int xe,int ye)
{
SqMgStack* st = InitSqStack();
Box path[MAX_SIZE], e;
mg[xi][yi] = -1;
bool find;
int iMg = 0;
int jMg = 0;
int i = 0;
int j = 0;
int adj = 0;
e.i = xi;
e.j = yi;
e.adj = -1;
PushSqStack(st, e);
while (!SqStackEmpty(st))
{
GetSqStack(st, &e);
i = e.i;
j = e.j;
adj = e.adj;
if (i == xe && j == ye)
{
FindThePath(st, path); //這個函數進行輸出棧中的值;
return true;
}
find = false;
while (adj < 4 && !find)
{
adj++;
switch (adj)
{
case 0:
iMg = i - 1 ;
jMg = j ;
break;
case 1:
iMg = i;
jMg = j +1 ;
break;
case 2:
iMg = i +1;
jMg = j ;
break;
case 3:
iMg = i ;
jMg = j -1;
break;
default:
break;
}
if (mg[iMg][jMg] == 0) find = true;
}
if (find)
{
st->data[st->top].adj = adj;
e.i = iMg;
e.j = jMg;
e.adj = -1;
PushSqStack(st, e);
mg[iMg][jMg] = -1;
}
else
{
PopSqStack(st, &e);
mg[e.i][e.j] = 0;
}
}
DestroySqStack(st);
return false;
}