1、构建栈
typedef struct CharStack
{
int top;
int data[MAXSIZE];
}*CharStackPtr;
2、栈的初始化
//初始化
CharStackPtr initStack()
{
CharStackPtr newPtr = (CharStackPtr)malloc(sizeof(struct CharStack));
newPtr->top = -1;
return newPtr;
}
3、进栈
进栈需要设置if函数来判断栈是否为满栈。
//进栈
void push(CharStackPtr paraStackPtr, int paraValue)
{
// Step 1. Space check.
if (paraStackPtr->top >= MAXSIZE - 1)
{
printf("Cannot push element: stack full.\r\n");
return;
}//Of if
// Step 2. Update the top.
paraStackPtr->top ++;
// Step 3. Push element.
paraStackPtr->data[paraStackPtr->top] = paraValue;
}// Of push
4、出栈
出栈需要设置if函数来判断栈是否为空栈
//出栈
char pop(CharStackPtr paraStackPtr)
{
// Step 1. Space check.
if (paraStackPtr->top < 0)
{
printf("Cannot pop element: stack empty.\r\n");
return '\0';
}//Of if
// Step 2. Update the top.
paraStackPtr->top --;
// Step 3. Push element.
return paraStackPtr->data[paraStackPtr->top + 1];
}// Of pop
5、输出栈
//输出
void outputStack(CharStackPtr newStack)
{
int i;
for(i = 0;i<=newStack->top;i++)
{
printf("%c ",newStack->data[i]);
}
printf("\r\n");
}
6、栈的应用—括号匹配
设置一个’#'在第一个位置方便测试。
//括号匹配
int bracketMatching(char*newString,int length)
{
CharStackPtr tempStack = initStack();
push(tempStack,'#');
char tempChar,tempPopedChar;
int i = 0;
for(i = 0;i<length;i++)
{
tempChar = newString[i];
switch(tempChar)
{
case '(':
case '{':
case '[':
push(tempStack,tempChar);
break;
case ')':
tempPopedChar = pop(tempStack);
if(tempPopedChar!='(')
{
return 0;
}
break;
case ']':
tempPopedChar = pop(tempStack);
if(tempPopedChar!='[')
{
return 0;
}
break;
case '}':
tempPopedChar = pop(tempStack);
if(tempPopedChar!='{')
{
return 0;
}
break;
default:
break;//如果不是符号则跳出switch循环,判断下一个字符是不是符号
}
}
tempPopedChar = pop(tempStack);
if(tempPopedChar=='#')
return 1;
else
return 0;
}
7、总代码
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXSIZE 10
typedef struct CharStack
{
int top;
int data[MAXSIZE];
}*CharStackPtr;
//初始化
CharStackPtr initStack()
{
CharStackPtr newPtr = (CharStackPtr)malloc(sizeof(struct CharStack));
newPtr->top = -1;
return newPtr;
}
//输出
void outputStack(CharStackPtr newStack)
{
int i;
for(i = 0;i<=newStack->top;i++)
{
printf("%c ",newStack->data[i]);
}
printf("\r\n");
}
//进栈
void push(CharStackPtr paraStackPtr, int paraValue)
{
// Step 1. Space check.
if (paraStackPtr->top >= MAXSIZE - 1)
{
printf("Cannot push element: stack full.\r\n");
return;
}//Of if
// Step 2. Update the top.
paraStackPtr->top ++;
// Step 3. Push element.
paraStackPtr->data[paraStackPtr->top] = paraValue;
}// Of push
//出栈
char pop(CharStackPtr paraStackPtr) {
// Step 1. Space check.
if (paraStackPtr->top < 0)
{
printf("Cannot pop element: stack empty.\r\n");
return '\0';
}//Of if
// Step 2. Update the top.
paraStackPtr->top --;
// Step 3. Push element.
return paraStackPtr->data[paraStackPtr->top + 1];
}// Of pop
//测试
void pushPopTest() {
printf("---- pushPopTest begins. ----\r\n");
CharStackPtr tempStack = initStack();
printf("After initialization, the stack is: ");
outputStack(tempStack);
char ch;
for (ch = 'a'; ch < 'm'; ch ++) {
printf("Pushing %c.\r\n", ch);
push(tempStack, ch);
outputStack(tempStack);
}
int i;
for (i = 0; i < 3; i ++) {
ch = pop(tempStack);
printf("Pop %c.\r\n", ch);
outputStack(tempStack);
}
printf("---- pushPopTest ends. ----\r\n");
}
//括号匹配
int bracketMatching(char*newString,int length)
{
CharStackPtr tempStack = initStack();
push(tempStack,'#');
char tempChar,tempPopedChar;
int i = 0;
for(i = 0;i<length;i++)
{
tempChar = newString[i];
switch(tempChar)
{
case '(':
case '{':
case '[':
push(tempStack,tempChar);
break;
case ')':
tempPopedChar = pop(tempStack);
if(tempPopedChar!='(')
{
return 0;
}
break;
case ']':
tempPopedChar = pop(tempStack);
if(tempPopedChar!='[')
{
return 0;
}
break;
case '}':
tempPopedChar = pop(tempStack);
if(tempPopedChar!='{')
{
return 0;
}
break;
default:
break;//如果不是符号则跳出switch循环,判断下一个字符是不是符号
}
}
tempPopedChar = pop(tempStack);
if(tempPopedChar=='#')
return 1;
else
return 0;
}
void bracketMatchingTest() {
char* tempExpression = "[2 + (1 - 3)] * 4";
int tempMatch = bracketMatching(tempExpression, 17);
printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);
tempExpression = "( ) )";
tempMatch = bracketMatching(tempExpression, 6);
printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);
tempExpression = "()()(())";
tempMatch = bracketMatching(tempExpression, 8);
printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);
tempExpression = "({}[])";
tempMatch = bracketMatching(tempExpression, 6);
printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);
tempExpression = ")(";
tempMatch = bracketMatching(tempExpression, 2);
printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);
}
int main()
{
pushPopTest();
//bracketMatchingTest();
return 0;
}
8、运行结果