PDA

View Full Version : سوال: متعادل بودن پرانتزها در یک رشته



sanchez222
یک شنبه 26 دی 1389, 11:04 صبح
سلام
میخوام در زبان c یه تابع بنویسم که تعداد پرانتزها رو بشماره و متعادل بودن اون ها رو چک کنه.
برای شمارش مشکلی ندارم اما متعادل بودن رو شک دارم.
باید تعداد هرکدوم از پرانتز ها رو بشماره و تساویشون رو چک کنه؟
ممنون میشم راهنماییم کنید.

Felony
یک شنبه 26 دی 1389, 11:29 صبح
تو یک حلقه رشته رو پیمایش کنید و به ازای هر پرانتز باز یک واحد به یک متغییر اضافه و به ازای هر پرانتز بسته یک واحد از همون متغییر کم کنید ، در آخر بررسی کنید اگر مقدار متغییر 0 بود یعنی تعداد پرانتزهای باز با بسته یکسان هستند :


#include<iostream.h>
#include<conio.h>

main()
{
char Str[20]="((12*1)/7+6)+(9/9)";
int i;
int P=0;

for (i=0; i<=20; i++)
{
if (Str[i]=='(')
P++;
if (Str[i]==')')
P--;
}
if (P==0)
cout<<"True";
else
cout<<"False";
getch();
}

quiet_programmer
سه شنبه 28 دی 1389, 14:57 عصر
ضمن تائید و تشکر از کد جناب مجتبی تاجیک (http://barnamenevis.org/member.php?63881-%D9%85%D8%AC%D8%AA%D8%A8%DB%8C-%D8%AA%D8%A7%D8%AC%DB%8C%DA%A9).

ولی برای اینکه تابع کاملی داشته باشی تو کد جناب مجتبی تاجیک (http://barnamenevis.org/member.php?63881-%D9%85%D8%AC%D8%AA%D8%A8%DB%8C-%D8%AA%D8%A7%D8%AC%DB%8C%DA%A9) بعد از اینکه کاراکتری با پرانتز بسته چک شد یه واحد از p کم بشه و بلافاصله p رو چک کن که منفی نشده باشه که اگه بشه یعنی قبل اینکه پرانتزی باز بشه بسته شده. مثل

"(a+b))(". که بدون برسی منفی شدن p این رشته قابل قبوله

Salar Ashgi
شنبه 02 بهمن 1389, 11:44 صبح
یک مثال نسبتا کاربردی توسط پشته ها :



#include <iostream>
#include <conio>
#include <stack>
#include <string>
#include <vector>
using namespace std;
int main(){
string str = "(2+3*(5+6/2))+(3/(6+7*3))";
stack<char,vector<char>> s;
for(int i=0;i<str.size();i++){
if(str[i]=='(')
s.push('(');
if(str[i]==')')
s.pop();}
if(s.empty())
cout<<"True \n";
else
cout<<"False \n";
getch();
}


موفق باشید ./