一、栈:
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
二、老师的代码
#include#include #define STACK_MAX_SIZE 10 typedef struct CharStack { int top; int data[STACK_MAX_SIZE]; //The maximum length is fixed. } *CharStackPtr; void outputStack(CharStackPtr paraStack) { for (int i = 0; i <= paraStack->top; i ++) { printf("%c ", paraStack->data[i]); }// Of for i printf("rn"); }// Of outputStack CharStackPtr charStackInit() { CharStackPtr resultPtr = (CharStackPtr)malloc(sizeof(CharStack)); resultPtr->top = -1; return resultPtr; }//Of charStackInit void push(CharStackPtr paraStackPtr, int paraValue) { // Step 1. Space check. if (paraStackPtr->top >= STACK_MAX_SIZE - 1) { printf("Cannot push element: stack full.rn"); 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.rn"); return ' '; }//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. ----rn"); // Initialize. CharStackPtr tempStack = charStackInit(); printf("After initialization, the stack is: "); outputStack(tempStack); // Pop. for (char ch = 'a'; ch < 'm'; ch ++) { printf("Pushing %c.rn", ch); push(tempStack, ch); outputStack(tempStack); }//Of for i // Pop. for (int i = 0; i < 3; i ++) { ch = pop(tempStack); printf("Pop %c.rn", ch); outputStack(tempStack); }//Of for i printf("---- pushPopTest ends. ----rn"); }// Of pushPopTest void main() { pushPopTest(); }// Of main
三、初始化:
typedef struct Stack
{
int top;
int data[MAX_SIZE];
} *StackPtr;
StackPtr initStack()
{
StackPtr resultPtr = (StackPtr)malloc(sizeof(struct Stack));
resultPtr->top = -1;
return resultPtr;
}
四、插入:
void outputStack(StackPtr paraStack)
{
for(int i=0;i<=paraStack->top;i++)
{
printf("%c ",paraStack->data[i]);
}
printf("rn");
}
五,出栈
char pop(StackPtr paraStackPtr)
{
//判断空栈
if(paraStackPtr->top < 0)
{
printf("空栈,不能删除rn");
return ' ';
}
paraStackPtr->top --;
return paraStackPtr->data[paraStackPtr->top + 1];
}
六、入栈:
void push(StackPtr paraStackPtr,int paraValue)
{
//判断栈是否满
if(paraStackPtr->top >= MAX_SIZE)
{
printf("栈满,不能添加rn");
return;
}
paraStackPtr->top ++;
paraStackPtr->data[paraStackPtr->top] = paraValue;
}
七、测试:
void pushPopText()
{
printf("栈进出测试开始:rn");
//初始化
StackPtr tempStack = initStack();
printf("初始化后的栈:");
outputStack(tempStack);
//入栈
for(char ch='a';ch<'n';ch++)
{
printf("添加%c:",ch);
push(tempStack,ch);
outputStack(tempStack);
}
//出栈
for(int i=0;i<4;i++)
{
char ch=pop(tempStack);
printf("删除%c:",ch);
outputStack(tempStack);
}
printf("测试结束。rn");
printf("rn");
}
括号匹配
括号匹配算法及C语言实现. 在编写代码的时候,经常会用到两种括号:圆括号 “ ()” 和大括号 “ {}” 。. 不管使用哪种括号,程序编译没有问题的其中一个重要因素就是所使用的括号是否能够匹配上. 在编写程序时,括号可以嵌套,即: “ ( { ()})” 这种形式,但 “ ( {)” 或者 “ ( {}” 都不符合要求。. 括号匹配项目要求: 给出任意搭配的括号,判断是否匹配。.
一、老师的代码:
#include#include #define STACK_MAX_SIZE 10 typedef struct CharStack { int top; int data[STACK_MAX_SIZE]; //The maximum length is fixed. } *CharStackPtr; void outputStack(CharStackPtr paraStack) { for (int i = 0; i <= paraStack->top; i ++) { printf("%c ", paraStack->data[i]); }// Of for i printf("rn"); }// Of outputStack CharStackPtr charStackInit() { CharStackPtr resultPtr = (CharStackPtr)malloc(sizeof(struct CharStack)); resultPtr->top = -1; return resultPtr; }//Of charStackInit void push(CharStackPtr paraStackPtr, int paraValue) { // Step 1. Space check. if (paraStackPtr->top >= STACK_MAX_SIZE - 1) { printf("Cannot push element: stack full.rn"); 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.rn"); return ' '; }//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. ----rn"); // Initialize. CharStackPtr tempStack = charStackInit(); printf("After initialization, the stack is: "); outputStack(tempStack); // Pop. for (char ch = 'a'; ch < 'm'; ch ++) { printf("Pushing %c.rn", ch); push(tempStack, ch); outputStack(tempStack); }//Of for i // Pop. for (int i = 0; i < 3; i ++) { ch = pop(tempStack); printf("Pop %c.rn", ch); outputStack(tempStack); }//Of for i printf("---- pushPopTest ends. ----rn"); }// Of pushPopTest bool bracketMatching(char* paraString, int paraLength) { // Step 1. Initialize the stack through pushing a '#' at the bottom. CharStackPtr tempStack = charStackInit(); push(tempStack, '#'); char tempChar, tempPopedChar; // Step 2. Process the string. for (int i = 0; i < paraLength; i++) { tempChar = paraString[i]; switch (tempChar) { case '(': case '[': case '{': push(tempStack, tempChar); break; case ')': tempPopedChar = pop(tempStack); if (tempPopedChar != '(') { return false; } // Of if break; case ']': tempPopedChar = pop(tempStack); if (tempPopedChar != '[') { return false; } // Of if break; case '}': tempPopedChar = pop(tempStack); if (tempPopedChar != '{') { return false; } // Of if break; default: // Do nothing. break; }// Of switch } // Of for i tempPopedChar = pop(tempStack); if (tempPopedChar != '#') { return true; } // Of if return true; }// Of bracketMatching void bracketMatchingTest() { char* tempExpression = "[2 + (1 - 3)] * 4"; bool tempMatch = bracketMatching(tempExpression, 17); printf("Is the expression '%s' bracket matching? %d rn", tempExpression, tempMatch); tempExpression = "( ) )"; tempMatch = bracketMatching(tempExpression, 6); printf("Is the expression '%s' bracket matching? %d rn", tempExpression, tempMatch); tempExpression = "()()(())"; tempMatch = bracketMatching(tempExpression, 8); printf("Is the expression '%s' bracket matching? %d rn", tempExpression, tempMatch); tempExpression = "({}[])"; tempMatch = bracketMatching(tempExpression, 6); printf("Is the expression '%s' bracket matching? %d rn", tempExpression, tempMatch); tempExpression = ")("; tempMatch = bracketMatching(tempExpression, 2); printf("Is the expression '%s' bracket matching? %d rn", tempExpression, tempMatch); }// Of bracketMatchingTest void main() { // pushPopTest(); bracketMatchingTest(); }// Of main
#include#include struct stack //存放栈的信息 { int top; char *bottom; int size; }; int IsEmpty(struct stack *s) //判断是否为空 { if (s->top == -1) { return 0; } else { return 1; } } int push(struct stack *s, char x) //入栈 { char *p = s->bottom; p[++(s->top)] = x; } int pop(struct stack *s) //出栈 { int ret = IsEmpty(s); if (ret == 0) { printf("此栈已空n"); return 0; } s->top--; } char rToL(char c) //右括号转左括号 { switch (c) { case '}': return '{'; case ']': return '['; case ')': return '('; } } int main() { int i = 0; int MAX = 1024; //字符数组的最大值 char str[MAX]; //存放字符串的空间 fgets(str, MAX, stdin); //从终端读取一个字符串 int size = strlen(str); //字符串的大小 char stack[size]; //栈的空间与字符串大小想等 struct stack s = {-1, stack, size}; //定义栈的信息 for (i = 0; i < size; i++) //遍历字符串 { if (str[i] == '{' || str[i] == '[' || str[i] == '(') //有左括号就入栈 { push(&s, str[i]); } if (str[i] == '}' || str[i] == ']' || str[i] == ')') { str[i] = rToL(str[i]); //把右括号转成左括号 if (stack[s.top] == str[i]) //与栈顶括号比较 { pop(&s); //相同则出栈 } else { printf("括号不匹配!n"); return 0; } } } int ret = IsEmpty(&s); //判空 if (ret == 0) { printf("括号匹配^v^!n"); } else { printf("括号不匹配!n"); } return 0; }



