栈的实现以及括号匹配问题和你波兰表达式
在这里解释一下括号匹配问题和你波兰表达式
1,括号匹配问题
一个左括号一个右括号看是否配对,方法是将其全部压入栈中,然后依次往出拿括号进行匹配
2.逆波兰表达式
表达式
用途
优势
#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#define T 10
#define MAX 100
typedef char DataType;
typedef struct Stack
{
DataType arr[MAX];
//int capacity;
int size;
}stack,*PStack;
stack sta;
//void add(PStack ps , DataType x);
// 栈的初始化
void StackInit(PStack ps);
// 入栈
void StackPush(PStack ps, DataType data);
// 出栈
void StackPop(PStack ps);
//
// 获取栈顶元素
DataType StackTop(PStack ps);
// 获取栈中元素个数
int StackSize(PStack ps);
// 检测栈是否为空
int StackEmpty(PStack ps);
void PrintStack(PStack ps);//打印栈
//括号匹配问题
int IsBrackets(char *ptr);
//void IsMach(char *a, PStack ps);
//
计算逆波兰表达式
//void Calculate(char *a, PStack ps);
void Pipei();
function.c文件
#include"zhan.h"
// 栈的初始化
void StackInit(PStack ps)
{
assert(ps);
ps->size = 0;
}
//入栈
void StackPush(PStack ps, DataType data)
{
assert(ps);
ps->arr[ps->size] = data;
ps->size++;
}
// 出栈
void StackPop(PStack ps)
{
assert(ps);
ps->size--;
}
// 获取栈顶元素
DataType StackTop(PStack ps)
{
assert(ps);
return ps->arr[ps->size-1];
}
//获取栈中元素个数
int StackSize(PStack ps)
{
assert(ps);
return ps->size;
}
//检测栈是否为空
int StackEmpty(PStack ps)
{
if(ps->size)
return 1;
else
return 0;
}
void PrintStack(PStack ps)//打印栈
{
int i = 0;
for(;i < ps->size; i++)
{
printf("%c ",ps->arr[i]);
}
}
void Pipei()//字符串匹配
{ int j;
char right;
char left;
char a[T] = {'1',']','0','[','[','l','{','}','{','}'};
/*for(z = 0;z < T;z++)
{
scanf("%c",a[z]);
}*/
StackInit(&sta);
for(j = 0;j < T; j++)
{
if((a[j] == '[')||(a[j] == ']')||(a[j] == '{')||(a[j] == '}')||(a[j] == '(')||(a[j] == ')'))
StackPush(&sta, a[j]);
}
PrintStack(&sta);
while(StackEmpty(&sta))
{
right = StackTop(&sta);
StackPop(&sta);
left = StackTop(&sta);
StackPop(&sta);
/*if((right == '[' && (left != ']'))||(right == '{' &&(left != '}'))||(right == '(' &&(left != ')')))
{
printf("匹配失败");
system("pause");
return;
}*/
if(right != ']'||right != '}'||right != ')')
{ printf("匹配失败");
return 0;}
if((right == ']' && (left != '['))||(right == '}' &&(left != '{'))||(right == ')' &&(left != '(')))
{
printf("匹配失败");
system("pause");
return;
}
}
printf("匹配成功");
system("pause");
}
int nibolan()
{
int i = 0;
int num = 0;
int flag = 0;
int right,left;
int len = 0;
char *str = "12 3 4 + * 6 - 2 8 / +";
len = strlen(str);
printf("len 的长度为%d\n",len);
for(;i < len; i++)
{
if(str[i] <= '9'&& str[i] >= '0')
{
num = num*10 + (str[i]-'0');
flag = 1;
}
if(str[i] == ' '&& flag)
{
StackPush(&sta, num);
num = 0;
flag = 0;
}
if((str[i] == '+')||(str[i] == '-')||(str[i] == '*')||(str[i] == '/'))
{
right = StackTop(&sta);
StackPop(&sta);
left = StackTop(&sta);
StackPop(&sta);
switch(str[i])
{
case '+':
StackPush(&sta, (right + left));break;
case '-':
StackPush(&sta, (right - left));break;
case '*':
StackPush(&sta, (right * left));break;
case '/':
StackPush(&sta, (right / left));break;
}
}
}
return StackTop(&sta);
}
test.c
括号匹配问题
#include"zhan.h"
#include<stdlib.h>
#define MAX 8
void pipei()
{
int j,t;
char right;
char left;
char a[MAX] ;
for(t = 0;t < MAX ;t++)
{
scanf("%c",&a[t]);
}
StackInit(&sta);
for(j = 0;j < MAX; j++)
{
if((a[j] == '[')||(a[j] == ']')||(a[j] == '{')||(a[j] == '}')||(a[j] == '(')||(a[j] == ')'))
StackPush(&sta, a[j]);
}
PrintStack(&sta);
while(StackEmpty(&sta))
{
right = StackTop(&sta);
StackPop(&sta);
left = StackTop(&sta);
StackPop(&sta);
if((right == '[' && (left != ']'))||(right == '{' &&(left != '}'))||(right == '(' &&(left != ')')))
{
printf("匹配失败");
system("pause");
return;
}
if((right == ']' && (left != '['))||(right == '}' &&(left != '{'))||(right == ')' &&(left != '(')))
{
printf("匹配失败");
system("pause");
return;
}
}
printf("匹配成功");
system("pause");
}
逆波兰表达式的实现
test2.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
#include"zhan.h"
int main()
{
int h;
//Pipei();
h = nibolan();
printf("h的值%d\n",h);
system("pause");
return 0;
}